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 を使用して作成したソースコード

SFSocketApp41.zip (SophiaFramework 4.1)

















