[C#,Python]WebSocketを試してみる。その2。

その1のチャットソフトを拡張してみる。

やりたいこと。
・ユーザーは名前を付けられる。
・ユーザーは自分の発言に色を使用出来る。
・現在ログインしているユーザー一覧を表示する。なお、ユーザーの増減が生じた場合は自動で更新されること。※ただし異常終了は除く。
・クライアントが異常終了しても、サーバーが落ちないこと。
・MessagePackを通信フォーマットに使用したい。
・ユーザーはアイコンを設定できる。 ← NEW!
・シェイクを送信できる。 ← NEW!

パケットフォーマットに本格的にMessagePackを使用する。
C#でのMessagePackの使用は、C#用のMessagePack実装ライブラリが自前クラスをシリアライズしてくれるが、Python版はまだ自前クラスのシリアライズは対応していない。そこで、サーバー(Python)側でも認識可能なデータにしてあげることで、MessagePackを効率的に使用することができる

データモデル

PacketFormat
{
    int CMDNO;   /// コマンド番号
    byte[] DATA; /// データ部
}

MessagePackではすべてbyte[]になるので、実際には次のような構造になります。

PacketFormat
{
    byte[] CMDNO;
    byte[] DATA;
}

クライアント側(C#)の送信部分

    int cmd = 0x10;    /// Login
    Message msg = new Message();
    
    msg.USERID = 1010;           /// User ID
    msg.NAME = "むんむんむらむら"; /// User Name
    msg.ICON = imagedata;        /// ICON Data

    // 送信データの作成
    // データモデルに沿った形にする
    var sendData = new List<byte[]>();
    sendData.add( cmd.Object2MessagePack() );
    sendData.add( msg.Object2MessagePack() );

    // WebSocketで送信
    ws.SendMessage( sendData.ToArray().Object2MessagePack() );

サーバー側(Python)の受信部分

import msgpack

msg = ws.receive()

msgpack_msg = msgpack.unpackb( msg )
cmd = msgpack.unpackb( msgpack_msg[0] )

if cmd == 0x10:
    print "Login"

ちょっとサーバー側の実装に合わせたパケットフォーマットになるけど、先頭のCMDNOにより処理の振り分けが可能になり、データ部分のunpackはそれぞれの処理に任せることができるので、コーディングがスマートになる。C,C++とかだとvoid*で受けたデータとかをヘッダー部分だけ読み取って処理を振り分けたりするので、それと同じ。

→その3へ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


This blog is kept spam free by WP-SpamFree.