ホーム > デベロッパ > BREW プログラミング入門 > TCP / IP ネットワークプログラミング > - 3 / 3 -

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++ のオブジェクト指向に則ったプログラミングによって、プログラムが一段と読みやすくなります。