TCPConnection
TCPConnection
クラスを使用すると、サーバー へのTransmission Control Protocol (TCP) クライアント接続を管理でき、これによってデータの送受信と、コールバックを使用した接続ライフサイクルイベントの管理が可能になります。
TCPConnection
クラスは4D
クラスストアにて提供されています。 TCP 接続は、TCPConnection オブジェクト を返す4D.TCPConnection.new() 関数を使用して作成できます。
全てのTCPConnection
クラス関数はスレッドセーフです。
標準の4D オブジェクトのrefcounting のおかげで、TCPConnection は参照されなくなったら自動的にリリースされるようになっています。 結果的に、それに関連したリソースは、明示的な終了を必要とせずに適切にクリーンアップされます。
TCPConnection オブジェクトはメモリ内にそれへの参照が存在しなくなった時にリリースされます。 これ一般的に、例えばメソッド実行の最後にローカル変数が消去されるときに発生します。 接続を"強制的に" 終了させたい場合には、Null を代入することで参照を無効化してください。
For debugging and monitoring, you can use the 4DTCPUDPLog.txt log file that records events related to TCP connections. 記録されるイベントには、データ送信、エラー、接続ライフサイクル情報などが含まれます。
履歴
リリース | 内容 |
---|---|
20 R9 | 新しい listener 、address 、および port 属性 |
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 オブジェクトは以下のプロパティと関数を提供します:
address : Text リモートマシンのIP アドレスまたはドメイン名 |
closed : Boolean 接続が閉じられているかどうかの情報が格納されています |
errors : Collection 接続に関連したエラーオブジェクトのコレクションが格納されています |
listener : ObjectTCPConnection を作成したTCPListener オブジェクト(あれば) |
noDelay : Boolean Nagle のアルゴリズムが無効化されている( true ) か有効かされている(false ) かの情報が格納されています |
port : Number リモートマシンのポート番号 |
.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 | -> | 接続の設定オプション |
戻り値 | 4D.TCPConnection | <- | 新しいTCPConnection オブジェクト |
説明
The 4D.TCPConnection.new()
function creates a new TCP connection to the specified serverAddress and serverPort, using the defined options, and returns a 4D.TCPConnection
object.
options
引数
options に渡すオブジェクトは、次のプロパティを持つことができます:
プロパティ | 型 | 説明 | デフォルト |
---|---|---|---|
onConnection | Formula | 接続が確立した時にトリガーされるコールバック | 未定義 |
onData | Formula | データが受信されたときにトリガーされるコールバック | 未定義 |
onShutdown | Formula | 接続が適切に閉じられた時にトリガーされるコールバック | 未定義 |
onError | Formula | エラーの場合にトリガーされるコールバック | 未定義 |
onTerminate | Formula | TCPConnection がリリースされる直前にトリガーされるコールバック | 未定義 |
noDelay | Boolean | 読み出し専用 true の場合にはNagle のアルゴリズムを無効化します | false |
connectionTimeout | Real | 接続を確立するまでの最大時間(秒単位)。 これを超えると、接続を試みるのを中止します。 | システムによって定義、一般的には30 以上 |
コールバック関数
すべてのコールバック関数は、2つの引数を受け取ります:
引数 | 型 | 説明 |
---|---|---|
$connection | TCPConnection オブジェクト | カレントのTCP 接続インスタンス |
$event | TCPEvent オブジェクト | イベントに関する情報が含まれているオブジェクト |
コールバックの呼び出しの順番:
onConnection
は接続が確立した時にトリガーされます。onData
はデータが受信されるたびにトリガーされます。onShutdown
またはonError
はそれぞれ以下の場合にトリガーされます:onShutdown
は接続が適切に閉じられた時にトリガーされます。onError
はエラーが発生した場合にトリガーされます。
onTerminate
は常にTCPConnection がリリースされる直前にトリガーされます(接続が閉じられたか、エラーが発生した場合です)。
TCPEvent オブジェクト
コールバック関数 が呼ばれた際にはTCPEvent
オブジェクトが返されます。
.address
address : Text
説明
.address
プロパティにはリモートマシンのIP アドレスまたはドメイン名が格納されています。
.closed
closed : Boolean
説明
.closed
プロパティには、接続が閉じられているかどうかの情報が格納されています。 エラーによって、あるいはshutdown()
を呼び出したから、あるいはサーバーが閉じられたなどの理由で接続が閉じられている場合にはtrue
を返します。
.errors
errors : Collection
説明
.errors
プロパティには接続に関連したエラーオブジェクトのコレクションが格納されています。 各エラーオブジェクトにはエラーコード、エラーの詳細、そしてそのエラーを起こしたコンポーネントの署名が格納されています。
プロパティ | 型 | 説明 | |
---|---|---|---|
errors | Collection | エラー発生時の 4Dエラースタック | |
[].errCode | Number | 4Dエラーコード | |
[].message | Text | 4Dエラーの詳細 | |
[].componentSignature | Text | エラーを返した内部コンポーネントの署名 |
.listener
listener : Object
説明
.listener
プロパティにはTCPConnection
を作成したTCPListener
オブジェクト(あれば)が格納されています。 このプロパティは 読み取り専用 です。
.noDelay
noDelay : Boolean
説明
.noDelay
プロパティにはNagle のアルゴリズムが無効化されている(true
) か有効かされている(false
) かの情報が格納されています。 このプロパティは 読み取り専用 です。
.port
port : Number
説明
.port
プロパティには、リモートマシンのポート番号が格納されています。 このプロパティは 読み取り専用 です。
.send()
.send( data : Blob )
引数 | 型 | 説明 | |
---|---|---|---|
data | BLOB | -> | 送信するデータ |
説明
send()
関数は、データをサーバーに送信します。 接続がまだ確立されていない場合には、データは接続が確立されたあとに送信されます。
.shutdown()
.shutdown()
引数 | 型 | 説明 | |
---|---|---|---|
引数を必要としません |
説明
shutdown()
関数は接続のwrite チャンネル(クライアントからサーバーへのストリーム)を閉じます。その一方で、read チャンネル(サーバーからクライアントへのストリーム)は開かれたままとなります。これによって、接続がサーバーによって完全に閉じられるか、エラーが発生するまでは、データを受信し続けることができます。
.wait()
.wait( { timeout : Real } )
引数 | 型 | 説明 | |
---|---|---|---|
timeout | Real | -> | 最大待機時間(秒) |
説明
The wait()
function TCP 接続が閉じられるか、あるいはtimeout
引数で指定した秒数に達するまで待ちます。
.wait()
の実行中、コールバック関数は、SystemWorker
インスタンスから発生したものであるかどうかに関わらず、実行されます。 コールバックから terminate()
を呼び出すことで、.wait()
を終了することができます。 コールバックからshutdown()
を呼び出すことで、.wait()
を終了することができます。