メッセージハンドラチュートリアル

mpchat

これからHTTP関連のメッセージサーバー機能を説明していく際に、サンプルプログラムとして sample/multiprotocol_chat を用いる。

mpchat は複数の通信プロトコルに対応したチャットサーバーである。 各プロトコル毎の説明に入る前に、共通部分の説明を行う。

メッセージとプロトコル

アプリケーションプロトコル及びメッセージの定義は、mpchat_message で定義されている。

プロトコルは、リクエスト・レスポンスが対になるものと、サーバープッシュで通知するタイプがある。

サーバープッシュできない通信層のために、サーバープッシュされるメッセージをリクエスト・レスポンス型で受け取ることもできる。

mpchat_server

mpchat_server は、複数のプロトコルに対応したメッセージサーバーである。 nine はいくつかの通信プロトコルの実装を提供し、さらに各プロトコル毎にメッセージレイヤーの API も提供している。mpchat_server では、これらメッセージ層の API をそのまま並立して扱っている。

mpchat_server の代表的なクラスは次の通りである:
ChatService
サービスの本体。通信処理は扱わず、メッセージをパラメータとしてサービス機能を提供する。
Server
プロトコル毎の Broker クラスや ChatService を一元的に扱うクラス。
TcpBroker
TCP を用いたメッセージサーバー(MessageServer)を扱う。
HttpBroker
HTTP セッションを用いたメッセージサーバー(HttpMessageHandler)を扱う。
CometBroker
Comet を用いたメッセージサーバー(CometMessageHandler)を扱う。
WebSocketBroker
WebSocket を用いたメッセージサーバー(WebSocketMessageHandler)を扱う。

ChatService

ChatService はサーバーの核となるクラスで、チャットログの管理を行う。

class ChatService
{
      //! 新規発言を行う。この発言の番号を返す。
      int add(const ChatData& chat);

      //! index より新しい発言ログを得る。
      void get(int index, LogNotify* ret);
  ...

追加、取得の関数を定義している。 関数のパラメータには通信で用いるメッセージデータをそのまま用いている。

各通信層の実装は、通信層の特徴に合わせて ChatService の関数を呼びだす。

Server

Server クラスは各種 Broker と ChatService を管理し、設定や関連付けを行う。
class Server
{
   public:
      Server();
      bool initialize(const ServerConfig*);
      void turn();

   private:
      ChatService m_service;
      TcpBroker m_tcpBroker;
      nine::PathHttpServer m_httpServer;
      HttpBroker m_httpBroker;
      CometBroker m_cometBroker;
      WebSocketBroker m_wsBroker;
      XdomainHandler m_xHandler;
};
Server は、管理するオブジェクトをメンバ変数として持っている。 そして、これらメンバ変数の設定は のinitialize() 関数で行っている。
turn() では、管理下のオブジェクトの turn() を呼びだす。
void Server::turn()
{
   m_tcpBroker.turn();
   m_httpServer.turn();
   m_httpBroker.turn();
   m_cometBroker.turn();
   m_wsBroker.turn();
}