WebSocket メッセージハンドラ

WebSocketMessageHandler

WebSocketMessageHandler は、WebSocket サーバーで nineメッセージ通信を行うためのフレームワーククラスである。

サーバーの仕様

WebSocketMessageHandler は、nineメッセージを WebSocketHandler のフレームに流すようにしただけのものである。 フレームタイプにはテキスト用の 00 を使い、メッセージは JSON 文字列へ直列化する。

WebSocketMessageServer では、HttpServer とは別に独自に接続数を管理する。 このため、WebSocketChanel の ID とは別に、WebSocketMessageHandler 内でユニークなセッションID を用意している。

WebSocketMessageHandler の定義

WebSocketMessageHandler 定義から、一般的に使う部分を抜き出すと次のようになっている:
class WebSocketMessageHandler: public WebSocketHandler
{
   public:
      bool initialize(const WebSocketMessageHandlerConfig* pCfg);

      virtual void turn();

      bool post(int id, const Message*, const SendContext* = NULL);
      bool queue(int id, Message*, const SendContext* = NULL);
      bool flow(int id);
      bool cancel(int id, Message* pMsg);

      //! 後の turn() で接続を閉じる。
      void closeLater(int sid);

      virtual bool handleMessage(Message* pMsg);
      virtual void onSessionOpen(int sid, WebSocketChannel* pChannel);
      virtual void onSessionClose(int sid);
  ...
};
HttpMessageHandler と同様の関数が提供されている。

WebSocketMessageHandler は WebSocketHandler を継承している。利用するには、WebSocketHandler と同様に WebSocketServer の authorizeWebSocket() 関数の戻り値で渡せばよい。

WebSocketHandler は、onWebSocketReceive() などの生の WebSocket を扱うためのハンドラ関数を実装する必要があった。WebSocketMessageHandler ではこれらのハンドラ関数の実装をしているので、アプリケーション側でさらにオーバーライドする必要はない。

初期化

WebSocketMessageHandler は initialzie 関数を実装している。オブジェクトの生成後にこの関数を呼んで、適切に設定を行う必要がある。

パラメータに与える WebSocketMessageHandlerConfig 構造体は次のように定義されている:
struct WebSocketMessageHandlerConfig
{
      int nSessions; //!< セッションの数
      int sessionTimeoutSec; //!< 次のフレームが来るまでセッションを維持する時間[秒]

  • nSessions は WebSocketMessageHandler が扱える同時接続の最大数である。 WebSocket接続は HttpServer にとっても接続なので、HttpServer の最大同時接続数を超えることはない。
  • sessionTimeoutSec は、WebSocket 接続のタイムアウト時間である。

turn

WebSocketMessageHandler では定期的に turn() を呼ぶ必要がある。

turn() では、キューイングされたメッセージの送信を行う。

タイムアウト処理は、HttpServer の turn() の方で行っている。

セッション接続関数

セッションの新規確立時には onSessionOpen() が、セッションの終了 OnSessionClose() が呼ばれる。

セッションはタイムアウトで切断されるが、明示的に閉じたい場合には closeLater() を呼ぶ。

メッセージ関数

handleMessage(), post(), queue(), flow() といった一連のメッセージ関数を定義している。 これらの使い方は TCP の MessageServer と同じである。

handleMessage() で受け取ったメッセージオブジェクトの Message::getCommunicatorId() を呼び出して得られる値は、コミュニケータIDではなくセッションIDになっている。