4D 20 R8のリリースに伴い、ゲームチェンジャー的な機能が登場しました:TCPConnectionクラスです。この最新のクラスは、オブジェクト指向のシンタックスを活用し、非同期ネットワーク接続処理をサポートしています。TCPConnectionを使用すると、サーバー、プリンター、レジスター、産業用デバイスなど、事実上あらゆるものに接続できます。
このリリースでは、TCPクライアント機能が利用できるようになり、外部サーバーに接続してシームレスにデータを交換できるようになりました。
TCPConnectionの可能性を示すために、この記事ではTCP通信を簡素化するシングルトンクラスを使った簡単な実装を説明します。
シンプルなシングルトンクラスを使ったチュートリアル
HDIで使用されているクラスを簡略化した “ConnectionToTheServer “という共有シングルトン・クラスを使ってみましょう:
Shared Singleton Class constructor()
//Connect to a server
Function connect($address : Text; $port : Integer)
This.connection:=4D.TCPConnection.new($address; $port; This)
//Disconnect from the server
Function disconnect()
This.connection.shutdown()
This.connection:=Null
//Send a text to the server
Function sendText($text : Text)
var $blob : Blob
TEXT TO BLOB($text; $blob; UTF8 text without length)
This.sendBlob($blob)
//Send a blob to the server
Function sendBlob($blob : Blob)
This.connection.send($blob)
//Callback called when the connection is successfully established
Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection established")
//Callback called when the connection is properly closed
Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection closed")
//Callback called when receiving data. The simple servers always send a sentence to show to the user
Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT(BLOB to text($event.data; UTF8 text without length))
//Callback called when the connection is closed unexpectedly
Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Connection error")
このクラスの使い方はとても簡単です。まず、connect関数がサーバーに接続する:
cs.ConnectionToTheServer.me.connect("server IP address or domain name";1234/*server port*/)
connect関数はTCPConnectionオブジェクトをインスタンス化し、サーバーに接続します。また、3番目のパラメータとしてオプション・オブジェクトを受け取ります。このオブジェクトはすべてのコールバックを実装しなければならないので重要である。この例では、簡単にするために、すべてのコールバックを実装しているシングルトンを直接使用している。
connectが呼び出されると、sendTextまたはsendBlobを呼び出してデータをサーバーに送ることができる:
cs.ConnectionToTheServer.me.sendText("The text to send to the server")
TCPConnectionはblobデータのみを送信する。テキストを送信するには、まずsendText関数のようにブロブに変換する必要がある。
サーバーからデータを取得するには、コールバックを使用しなければならない。onConnectionは、サーバーとの接続が実際に確立されたときに呼び出される。onConnectionが呼ばれる前にデータを送信することも可能で、その場合、データは保持され、接続が確立されたときに送信される。onConnectionが呼ばれる前にデータを送信することも可能です:その場合、接続が確立され、データが送信され、すべてのデータが送信されると、接続は閉じられる。
もう一つの重要なコールバックはonDataである:これは、TCPConnectionがサーバーからデータを受信するたびに呼び出されます。受信したデータは$event.data blobでアクセス可能で、そのまま使用することも、例のようにBLOB to textコマンドでテキストに変換することもできます。
最後に:接続、送信、受信の後、接続の最後の重要な部分は閉じることです。接続を閉じるには3つの方法があります:サーバーが接続を閉じるか、クライアントが接続を閉じるか、接続エラーが発生して切断されるかです。
サーバーが接続を閉じると、onShutdownコールバックが呼び出されます。
クライアント側で接続を切断するには、onShutdownコールバックを呼び出します:
cs.ConnectionToTheServer.me.disconnect()
切断を呼び出すと、onShutdownコールバックも呼び出されます(接続が閉じられるため)。
最後に、接続エラーが発生して接続が強制的に閉じられると、onErrorコールバックが呼び出されます。onErrorコールバックは、サーバーへの接続に失敗した場合にも呼び出されます。
結論
お分かりのように、TCPConnectionクラスは堅牢な機能を提供しながら、驚くほど簡単に使用できます。データの送受信にかかわらず、外部デバイスやサーバーとの信頼性の高い通信を保証します。
ご質問やサポートが必要な場合は、4Dフォーラムまでお気軽にご連絡ください。