これからHTTP関連のメッセージサーバー機能を説明していく際に、サンプルプログラムとして sample/multiprotocol_chat を用いる。
mpchat は複数の通信プロトコルに対応したチャットサーバーである。 各プロトコル毎の説明に入る前に、共通部分の説明を行う。
アプリケーションプロトコル及びメッセージの定義は、mpchat_message で定義されている。
プロトコルは、リクエスト・レスポンスが対になるものと、サーバープッシュで通知するタイプがある。
サーバープッシュできない通信層のために、サーバープッシュされるメッセージをリクエスト・レスポンス型で受け取ることもできる。
Client->Server: LogRequest
取得したい最初の発言番号を付ける。
Server->Client: LogNotify
発言を返す。LogNotify には複数の発言が含まれる。
Client->Server: ChatRequest
名前と発言内容。
Server->Client: LogNotify
発言を返す。LogNotify には複数の発言が含まれる。
Server->Client: LogNotify
発言を通知する。
mpchat_server は、複数のプロトコルに対応したメッセージサーバーである。 nine はいくつかの通信プロトコルの実装を提供し、さらに各プロトコル毎にメッセージレイヤーの API も提供している。mpchat_server では、これらメッセージ層の API をそのまま並立して扱っている。
ChatService はサーバーの核となるクラスで、チャットログの管理を行う。
class ChatService
{
//! 新規発言を行う。この発言の番号を返す。
int add(const ChatData& chat);
//! index より新しい発言ログを得る。
void get(int index, LogNotify* ret);
...
追加、取得の関数を定義している。 関数のパラメータには通信で用いるメッセージデータをそのまま用いている。
各通信層の実装は、通信層の特徴に合わせて 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() 関数で行っている。
void Server::turn()
{
m_tcpBroker.turn();
m_httpServer.turn();
m_httpBroker.turn();
m_cometBroker.turn();
m_wsBroker.turn();
}