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
引数 | 型 | 説明 | |
---|---|---|---|
serverAddress | Text | -> | サーバーのドメイン名またはIP アドレス |
serverPort | Integer | -> | サーバーのポート番号 |
options | Object | -> | 接続の設定オプション |
戻り値 | TCPConnection | <- | 新しいTCPConnection オブジェクト |
説明
4D.TCPConnection.new()
関数は、serverAddress および serverPort 引数で接続したサーバーへ、options 引数で定義されたオプションを使用して、新規のTCP 接続を作成し、4D.HTTPRequest
オブジェクトを返します。
options
引数
options に渡すオブジェクトは、次のプロパティを持つことができます:
プロパティ | 型 | 説明 | デフォルト |
---|---|---|---|
onConnection | Formula | 接続が確立した時にトリガーされるコールバック | 未定義 |
onData | Formula | データが受信されたときにトリガーされるコールバック | 未定義 |
onShutdown | Formula | 接続が適切に閉じられた時にトリガーされるコールバック | 未定義 |
onError | Formula | エラーの場合にトリガーされるコールバック | 未定義 |
onTerminate | Formula | TCPConnection がリリースされる直前にトリガーされるコールバック | 未定義 |
noDelay | Boolean | 読み出し専用 true の場合にはNagle のアルゴリズムを無効化します | false |
コールバック関数
すべてのコールバック関数は、2つの引数を受け取ります:
引数 | 型 | 説明 |
---|---|---|
$connection | TCPConnection オブジェクト | カレントのTCP 接続インスタンス |
$event | TCPEvent オブジェクト | イベントに関する情報が含まれているオブジェクト |
コールバックの呼び出しの順番:
onConnection
は接続が確立した時にトリガーされます。onData
はデータが受信されるたびにトリガーされます。onShutdown
またはonError
はそれぞれ以下の場合にトリガーされます:onShutdown
は接続が適切に閉じられた時にトリガーされます。onError
はエラーが発生した場合にトリガーされます。
onTerminate
は常にTCPConnection がリリースされる直前にトリガーされます(接続が閉じられたか、エラーが発生した場合です)。
TCPEvent オブジェクト
コールバック関数 が呼ばれた際にはTCPEvent
オブジェクトが返されます。
.closed
closed : Boolean
説明
.closed
プロパティには接続が閉じられたかどうかの情報が格納されています。 エラーによって、あるいはshutdown()
を呼び出したから、あるいはサーバーが閉じられたなどの理由で接続が閉じられている場合にはtrue
を返します。
.errors
errors : Collection
説明
.errors
プロパティには、接続に関連したエラーオブジェクトのコレクションが格納されています。 各エラーオブジェクトにはエラーコード、エラーの詳細、そしてそのエラーを起こしたコンポーネントの署名が格納されています。
プロパティ | 型 | 説明 | |
---|---|---|---|
errors | Collection | エラー発生時の 4Dエラースタック | |
[].errCode | Number | 4Dエラーコード | |
[].message | Text | 4Dエラーの詳細 | |
[].componentSignature | Text | エラーを返した内部コンポーネントの署名 |
.noDelay
noDelay : Boolean
説明
.noDelay
プロパティには、whether Nagle のアルゴリズムが無効化されている(true
) か有効化されている(false
) かの情報が格納されています。 このプロパティは 読み取り専用 です。
.send()
.send( data : Blob )
引数 | 型 | 説明 | |
---|---|---|---|
data | BLOB | -> | 送信するデータ |
説明
send()
関数はデータをサーバーに送信します。 接続がまだ確立されていない場合には、データは接続が確立されたあとに送信されます。
.shutdown()
.shutdown()
引数 | 型 | 説明 | |
---|---|---|---|
引数を必要としません |
説明
shutdown()
関数は、接続のwrite チャンネル(クライアントからサーバーへのストリーム)を閉じます。その一方で、read チャンネル(サーバーからクライアントへのストリーム)は開かれたままとなります。これによって、接続がサーバーによって完全に閉じられるか、エラーが発生するまでは、データを受信し続けることができます。
.wait()
.wait( { timeout : Real } )
引数 | 型 | 説明 | |
---|---|---|---|
timeout | Real | -> | Maximum wait time in seconds |
説明
wait()
関数はTCP 接続が閉じられるか、あるいはtimeout
引数で指定した秒数に達するまで待ちます。
.wait()
の実行中、コールバック関数は、SystemWorker
インスタンスから発生したものであるかどうかに関わらず、実行されます。 コールバックからshutdown()
を呼び出すことで、.wait()
を終了することができます。