メインコンテンツまでスキップ
バージョン: 20 R8 BETA

TCPConnection

TCPConnection クラスを使用すると、サーバーへのTransmission Control Protocol (TCP) クライアント接続を管理でき、これによってデータの送受信と、コールバックを使用した接続ライフサイクルイベントの管理が可能になります。

TCPConnection クラスは4D クラスストアにて提供されています。 TCP 接続は、TCPConnection オブジェクト を返す4D.TCPConnection.new() 関数を使用して作成できます。

全てのTCPConnection クラス関数はスレッドセーフです。

標準の4D オブジェクトのrefcounting のおかげで、TCPConnection は参照されなくなったら自動的にリリースされるようになっています。 結果的に、それに関連したリソースは、明示的な終了を必要とせずに適切にクリーンアップされます。

TCPConnection オブジェクトはメモリ内にそれへの参照が存在しなくなった時にリリースされます。 これ一般的に、例えばメソッド実行の最後にローカル変数が消去されるときに発生します。 接続を"強制的に" 終了させたい場合には、Null を代入することで参照を無効化してください

履歴
リリース内容
20 R8クラスを追加

例題

以下の例題は、4D.TCPConnection および 4D.TCPEvent クラスを使用してどのようにTCP クライアント接続を管理し、イベントを扱い、データを送信し、そして適切に接続を閉じるかを表しています。 同期の例と非同期の例の両方が提供されています。

同期の例

以下の例題は、設定にシンプルなオブジェクトを使うことでどのように接続を確立し、データを送信し、通信を終了するかを表しています:

var $domain : Text := "127.0.0.1"
var $port : Integer := 10000
var $options : Object := New object() // 設定オブジェクト
var $tcpClient : 4D.TCPConnection
var $message : Text := "test message"

// 接続を開く
$tcpClient := 4D.TCPConnection.new($domain; $port; $options)

// データを送信する
var $blobData : Blob
TEXT TO BLOB($message; $blobData; UTF8 text without length)
$tcpClient.send($blobData)

// シャットダウンする
$tcpClient.shutdown()
$tcpClient.wait(0)

非同期の例

以下の例題は、接続ライフサイクルとイベントを管理するクラスを定義し、非同期に使用する方法を表しています:

// Class definition: cs.MyAsyncTCPConnection

Class constructor($url : Text; $port : Integer)
This.connection := Null
This.url := $url
This.port := $port

// ワーカーの中でローンチされたサーバーの一つに接続する
Function connect()
This.connection := 4D.TCPConnection.new(This.url; This.port; This)

// サーバーへの接続を切断する
Function disconnect()
This.connection.shutdown()
This.connection := Null

// サーバーにデータを送信する
Function getInfo()
var $blob : Blob
TEXT TO BLOB("Information"; $blob)
This.connection.send($blob)

// 接続が正常に確立された時に呼び出されるコールバック
Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection established")

// 接続が適切に閉じられた時に呼び出されるコールバック
Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection closed")

// サーバーからデータが受信されたときに呼び出されるコールバック
Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT(BLOB to text($event.data; UTF8 text without length))

// 警告: 一つのネットワークパケットで必要なデータを全て受け取れる保証はありません。

// 接続が予期せず閉じられた時に呼び出されるコールバック
Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection error")

// TCPConnection オブジェクトがリリースされる直前、onShutdown/onError の後に呼び出されるコールバック
Function onTerminate($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection terminated")


使用例

AsyncTCP という名前の新しいメソッドを作成し、このメソッドでTCP 接続を初期化して管理します:

var $myObject : cs.MyAsyncTCPConnection
$myObject := cs.MyAsyncTCPConnection.new("myURL"; 10000)
$myObject.connect()
$myObject.getInfo()
$myObject.disconnect()

AsyncTCP メソッドをワーカー内で呼び出します:

CALL WORKER("new process"; "Async_TCP")

TCPConnection オブジェクト

TCPConnection オブジェクトは共有不可のオブジェクトです。

TCPConnection オブジェクトは以下のプロパティと関数を提供します:


errors : Collection
接続に関連したエラーオブジェクトのコレクションが格納されています
noDelay : Boolean
whether Nagle のアルゴリズムが無効化されている(true) か有効化されている(false) かの情報が格納されています
.send( data : Blob )
データをサーバーに送信します
.shutdown()
接続のwrite チャンネル(クライアントからサーバーへのストリーム)を閉じます
.wait( { timeout : Real } )
TCP 接続が閉じられるか、あるいはtimeout 引数で指定した秒数に達するまで待ちます

4D.TCPConnection.new()

4D.TCPConnection.new( serverAddress : Text ; serverPort : Number ; options : Object ) : 4D.TCPConnection

引数説明
serverAddressText->サーバーのドメイン名またはIP アドレス
serverPortInteger->サーバーのポート番号
optionsObject->接続の設定オプション
戻り値TCPConnection<-新しいTCPConnection オブジェクト

説明

4D.TCPConnection.new() 関数は、serverAddress および serverPort 引数で接続したサーバーへ、options 引数で定義されたオプションを使用して、新規のTCP 接続を作成し、4D.HTTPRequest オブジェクトを返します。

options 引数

options に渡すオブジェクトは、次のプロパティを持つことができます:

プロパティ説明デフォルト
onConnectionFormula接続が確立した時にトリガーされるコールバック未定義
onDataFormulaデータが受信されたときにトリガーされるコールバック未定義
onShutdownFormula接続が適切に閉じられた時にトリガーされるコールバック未定義
onErrorFormulaエラーの場合にトリガーされるコールバック未定義
onTerminateFormulaTCPConnection がリリースされる直前にトリガーされるコールバック未定義
noDelayBoolean読み出し専用 true の場合にはNagle のアルゴリズムを無効化しますfalse

コールバック関数

すべてのコールバック関数は、2つの引数を受け取ります:

引数説明
$connectionTCPConnection オブジェクトカレントのTCP 接続インスタンス
$eventTCPEvent オブジェクトイベントに関する情報が含まれているオブジェクト

コールバックの呼び出しの順番:

  1. onConnection は接続が確立した時にトリガーされます。
  2. onData はデータが受信されるたびにトリガーされます。
  3. onShutdown または onError はそれぞれ以下の場合にトリガーされます:
    • onShutdown は接続が適切に閉じられた時にトリガーされます。
    • onError はエラーが発生した場合にトリガーされます。
  4. onTerminate は常にTCPConnection がリリースされる直前にトリガーされます(接続が閉じられたか、エラーが発生した場合です)。

TCPEvent オブジェクト

コールバック関数 が呼ばれた際にはTCPEvent オブジェクトが返されます。

.closed

closed : Boolean

説明

.closed プロパティには接続が閉じられたかどうかの情報が格納されています。 エラーによって、あるいはshutdown() を呼び出したから、あるいはサーバーが閉じられたなどの理由で接続が閉じられている場合にはtrue を返します。

.errors

errors : Collection

説明

.errors プロパティには、接続に関連したエラーオブジェクトのコレクションが格納されています。 各エラーオブジェクトにはエラーコード、エラーの詳細、そしてそのエラーを起こしたコンポーネントの署名が格納されています。

プロパティ説明
errorsCollectionエラー発生時の 4Dエラースタック
[].errCodeNumber4Dエラーコード
[].messageText4Dエラーの詳細
[].componentSignatureTextエラーを返した内部コンポーネントの署名

.noDelay

noDelay : Boolean

説明

.noDelay プロパティには、whether Nagle のアルゴリズムが無効化されている(true) か有効化されている(false) かの情報が格納されています。 このプロパティは 読み取り専用 です。

.send()

.send( data : Blob )

引数説明
dataBLOB->送信するデータ

説明

send() 関数はデータをサーバーに送信します。 接続がまだ確立されていない場合には、データは接続が確立されたあとに送信されます。

.shutdown()

.shutdown()

引数説明
引数を必要としません

説明

shutdown() 関数は、接続のwrite チャンネル(クライアントからサーバーへのストリーム)を閉じます。その一方で、read チャンネル(サーバーからクライアントへのストリーム)は開かれたままとなります。これによって、接続がサーバーによって完全に閉じられるか、エラーが発生するまでは、データを受信し続けることができます。

.wait()

.wait( { timeout : Real } )

引数説明
timeoutReal->Maximum wait time in seconds

説明

wait() 関数はTCP 接続が閉じられるか、あるいはtimeout 引数で指定した秒数に達するまで待ちます。

.wait() の実行中、コールバック関数は、SystemWorker インスタンスから発生したものであるかどうかに関わらず、実行されます。 コールバックからshutdown() を呼び出すことで、.wait() を終了することができます。