TCP接続を実行する新しいクラス

4D 20 R8 のリリースに伴い、状況を一変させる機能が登場しました: TCPConnectionクラスです。オブジェクト指向のシンタックスを活用し、非同期ネットワーク接続処理をサポートしているこの最新のクラスは、廃止予定である 4D Internet Commands の代替機能を提供するものです。TCPConnection を使用すると、サーバー、プリンター、レジスター、産業用デバイスなど、事実上あらゆるものに接続できるため、さまざまなネットワーク要件に対応する汎用性の高いツールとなりえます。

このリリースでは、TCPクライアント機能が利用できるようになり、外部サーバーに接続してシームレスにデータを交換できるようになりました。

HDI: TCPConnectionクラス

TCPConnection の可能性を示すために、この記事では TCP通信を簡素化するシングルトンクラスを使った簡単な実装を説明します。

シンプルなシングルトンクラスを使ったチュートリアル

HDI で使用されているクラスを簡略化した “ConnectionToTheServer” という共有シングルトンクラスを使ってみましょう:

Shared Singleton Class constructor()

// サーバーに接続します
Function connect($address : Text; $port : Integer)

    This.connection:=4D.TCPConnection.new($address; $port; This)

// サーバーとの接続を解除します
Function disconnect()

    This.connection.shutdown()
    This.connection:=Null

// サーバーにテキストを送信します
Function sendText($text : Text)

    var $blob : Blob
    TEXT TO BLOB($text; $blob; UTF8 text without length)
    This.sendBlob($blob)

// サーバーに BLOB を送信します
Function sendBlob($blob : Blob)

    This.connection.send($blob)

// 接続が確立したときに呼び出されるコールバック
Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("接続に成功しました")

// 接続が正常に終了したときに呼び出されるコーツバック
Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("接続を終了しました")

// データ受信時に呼び出されるコールバック。サーバーからは常に、ユーザーに表示するためのテキストが送られてきます
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("接続エラー")

このクラスの使い方はとても簡単です。まず、connect関数でサーバーに接続します:

cs.ConnectionToTheServer.me.connect("サーバーIPアドレスまたはドメイン名";1234/*サーバーポート*/)

connect関数は TCPConnectionオブジェクトをインスタンス化し、サーバーに接続します。TCPConnection のインスタンス化には、3番目の引数として optionオブジェクトを受け渡すことができます。すべてのコールバックを実装するため、このオブジェクト重要ですが、この例では簡素化のため、すべてのコールバックを実装しているシングルトンを直接使用します。

connect を呼び出したあと、sendText または sendBlob を呼び出してデータをサーバーに送ることができます:

cs.ConnectionToTheServer.me.sendText("サーバーに送信するテキスト")

TCPConnection は BLOBデータのみを送信します。テキストを送信するには、まず sendText関数のように BLOB に変換する必要があります。

サーバーからデータを取得するには、コールバックを使用します。最初に呼び出されるコールバックは onConnection で、サーバーとの接続が実際に確立されたときに呼び出されます。onConnection が呼ばれる前にデータを送信することも可能で、その場合データは保持され、接続が確立されたときに送信されます。接続・データ送信・接続解除をすべて待機なしで実行することも可能です。その場合、接続が確立され、データが送信され、そしてすべてのデータ送信が完了すると接続が閉じられます。

もう一つの重要なコールバックは onData です: これは、TCPConnection がサーバーからデータを受信するたびに呼び出されます。受信した BLOBデータは $event.data でアクセス可能です。これをそのまま使用することも、例題のように BLOB to text コマンドでテキストに変換することもできます。

接続・送信・受信の後、最後に重要となる部分は接続を閉じることです。接続が終了する方法は 3つあります: サーバーが接続を閉じるか、クライアントが接続を閉じるか、接続エラーが発生して切断されるかです。

サーバーが接続を閉じると、onShutdownコールバックが呼び出されます。

クライアント側で接続を切断するには、次のシングルトン関数を呼び出します:

cs.ConnectionToTheServer.me.disconnect()

disconnect を呼び出すと、接続が閉じられるため、onShutdownコールバックも呼び出されます。

最後に、接続エラーが発生して接続が強制的に閉じられると、onErrorコールバックが呼び出されます。onErrorコールバックは、サーバーへの接続に失敗した場合にも呼び出されます。

まとめ

このように、TCPConnectionクラスは堅牢な機能を提供しながら、驚くほど簡単に使用できます。データの送受信にかかわらず、外部デバイスやサーバーとの信頼性の高い通信を保証します。

ご質問やサポートが必要な場合は、4Dフォーラムまでお気軽にご連絡ください。

Nicolas Brachfogel
- プロダクトオーナー & シニアデベロッパー - Nicolas Brachfogelは、2017年にシニアデベロッパーとして4Dに入社しました(4D Serverとネットワークを担当)。Apple Siliconのリリースを管理するプロダクトオーナーとして、ユーザーストーリーを書いて機能仕様に落とし込み、機能実装が顧客のニーズを満たしているかを確認する役割を担っています。Institut Supérieur d'Informatique Appliquée (INSIA) を卒業した Nicolas は、2001年にソフトウェア開発者としてのキャリアをスタートさせました。JavaとC++で数年間コーディングした後、ゲーム会社のクライアント・サーバー開発を専門に担当。サーバー開発者/アーキテクトとして、多くのゲーム(Dofus Arena、Drakerz、Trivial Pursuit Go!)のサーバーアーキテクチャに携わり、成功を収めてきました。