TCP / IP ネットワークプログラミング - 3 / 3 -
SophiaFramework でのソケットプログラミング
SophiaFramework では、ソケットプログラミングのために SFXTCPSocket クラスが用意されています。
SophiaFramework によるアプリ
- 最初に、"Push Select Key" を表示します。
- セレクトキーが押されると、通信が開始します。通信が終了すると、受け取ったデータを表示します。
ネットワークを使うための準備
SFXTCPSocket は TCP ソケットを表す SophiaFramework のクラスです。
アプリケーションクラスには、通信用の変数を追加します。
■アプリケーションクラスの宣言
SFMTYPEDEFCLASS(SFSocketApp) class SFSocketApp : public SFRApplication { SFMSEALCOPY(SFSocketApp) private: SFXTCPSocket _socket; SFXAnsiStringStreamWriter _writer; SFXAnsiStringStreamReader _reader; SFXAnsiString _message; // ( 略 ) };
SFXTCPSocket クラスは内部で INetMgr インターフェースや ISocket インターフェースを保持しています。ユーザは、これらのインターフェースの取得や解放などの処理を書く必要はありません。
また、ホスト名のIPアドレスの解決が自動的に行われるので、前ページの処理の流れと比較してみると、簡略化されていることが分かります。
コールバック
BREW ネイティブのソケットプログラミングではコールバックを多用しました。
SophiaFramework も同じです。ただし、コールバック関数は、SophiaFramework で用意されているマクロを使い、スマートに書くことができます。
// キー ハンドラ HANDLER_IMPLEMENT_BOOLEVENT(SFSocketApp40, OnKey, event) { // ここにキーが押されたときの処理を記述します。 switch (event.GetP16()) { case AVK_SELECT: _socket.Open(); _socket.Connect(SFXSocketAddress(ACCESS_URL, 80), CALLBACK_FUNCTION(OnConnect)); return true; } return false; } // メッセージの送信を開始する。 CALLBACK_IMPLEMENT_SFXTCPSOCKET(SFSocketApp40, OnConnect, error) { if(error == SFERR_NO_ERROR){ _socket.GetStreamWriter(1024, &_writer); _writer << "GET / HTTP/1.0\n\n"; _writer.Flush(CALLBACK_FUNCTION(OnWrite)); } else{ _socket.Close(); } return; }
SophiaFramework のメリット
BREW ネイティブインターフェースを使用する部分のコードは、SophiaFramework とほぼ同じです。 違いは、インスタンス生成が簡潔に書ける、スマートポインタによってメモリ解放処理が自動的に行われるの 2 点です。
特に、画面描画や通信処理では、SophiaFramework を使えばコードがすっきりします。
たとえば、BREW ネイティブの画面描画では、保持している char * 文字列を、AECHAR * 文字列に変換して、画面の横幅で表示できる文字数を計算しながら、1 行ずつ文字列を描画しなければいけません。
SophiaFramework なら、文字列の描画は「文字列をウインドウに表示する」という、わずか 1 行で済みます。画面スクロールもサポートしています。
また、C++ のオブジェクト指向に則ったプログラミングによって、プログラムが一段と読みやすくなります。
記事掲載プログラムのソースコード
SophiaFramework UNIVERSE を使用して作成したソースコード
socketapp_sf.zip (SophiaFramework UNIVERSE 5.1)