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

TCPConnection

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

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

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

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

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

4DTCPUDPLog.txt ファイル

TCP 接続に関連したイベントを記録する[4DTCPUDPLog.txt ログファイル]を使用すると、 デバッグやモニタリングを行うことができます。 記録されるイベントには、データ送信、エラー、接続ライフサイクル情報などが含まれます。

履歴
リリース内容
20 R9新しい listeneraddress、および 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 : Object
TCPConnection を作成した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

引数説明
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
connectionTimeoutReal接続を確立するまでの最大時間(秒単位)。 これを超えると、接続を試みるのを中止します。システムによって定義、一般的には30 以上

コールバック関数

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

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

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

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

TCPEvent オブジェクト

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

.address

address : Text

説明

.address プロパティにはリモートマシンのIP アドレスまたはドメイン名が格納されています。

.closed

closed : Boolean

説明

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

.errors

errors : Collection

説明

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

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

.listener

listener : Object

説明

.listener プロパティにはTCPConnection を作成したTCPListener オブジェクト(あれば)が格納されています。 このプロパティは 読み取り専用 です。

.noDelay

noDelay : Boolean

説明

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

.port

port : Number

説明

.port プロパティには、リモートマシンのポート番号が格納されています。 このプロパティは 読み取り専用 です。

.send()

.send( data : Blob )

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

説明

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

.shutdown()

.shutdown()

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

説明

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

.wait()

.wait( { timeout : Real } )

引数説明
timeoutReal->最大待機時間(秒)

説明

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

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