WebSocketMessageHandler は、WebSocket サーバーで nineメッセージ通信を行うためのフレームワーククラスである。
WebSocketMessageHandler は、nineメッセージを WebSocketHandler のフレームに流すようにしただけのものである。 フレームタイプにはテキスト用の 00 を使い、メッセージは JSON 文字列へ直列化する。
WebSocketMessageServer では、HttpServer とは別に独自に接続数を管理する。 このため、WebSocketChanel の ID とは別に、WebSocketMessageHandler 内でユニークなセッションID を用意している。
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 関数を実装している。オブジェクトの生成後にこの関数を呼んで、適切に設定を行う必要がある。
struct WebSocketMessageHandlerConfig
{
int nSessions; //!< セッションの数
int sessionTimeoutSec; //!< 次のフレームが来るまでセッションを維持する時間[秒]
WebSocketMessageHandler では定期的に turn() を呼ぶ必要がある。
turn() では、キューイングされたメッセージの送信を行う。
タイムアウト処理は、HttpServer の turn() の方で行っている。
セッションの新規確立時には onSessionOpen() が、セッションの終了 OnSessionClose() が呼ばれる。
セッションはタイムアウトで切断されるが、明示的に閉じたい場合には closeLater() を呼ぶ。
handleMessage(), post(), queue(), flow() といった一連のメッセージ関数を定義している。 これらの使い方は TCP の MessageServer と同じである。
handleMessage() で受け取ったメッセージオブジェクトの Message::getCommunicatorId() を呼び出して得られる値は、コミュニケータIDではなくセッションIDになっている。