nineマッチングサーバーフレームワークでは、固定的なプロトコルセットを提供している。 フレームワーク利用の際には、各プロトコルに対するアクションを記述することで行う。
プロトコルを拡張したい場合は、後述する NestMessage と MessageExtension の二つの仕組みで行うことができる。
プロトコルは Request-Response 対と Notify という二種三個のメッセージタイプに分けられる。
このプロトコル設計に特徴的な部分は、Request に対して Response と Notify という二つの応答が返るところである。ネットワーク効率は悪くなるが、Client-Pull, Server-Push の両方の通信形式にひとつのコードで対応できる利点がある。
例えば、Client-Pull 型のログイン処理は次のようなフローになる:
Server-Push による自動的なログインは次のようになる。
ここで、クライアントのログイン処理のコードは共通にできる。
フレームワークの定義するメッセージの多くは、MessageExtension というクラスを継承している。これは定義されたメンバ以外のデータを含める際に使うことができる。
例えば、8bit整数の情報を加えたいとすると、送信側は次のように記述する。
LoginRequest msg; msg.extSetInt8(0, 0xFF);
受信側では、次のように記述して拡張情報を受け取ることができる。
bool MyModule::handleClientLogin(LoginRequest* pMsg, ...)
{
int8 myext;
pMsg->extGetInt8(0, &myext);
}
ここで extSetInt8, extGetInt8 の両関数の第一引数に使用した 0 は、拡張データの ID である。重複しないよう、アプリケーション側で管理する必要がある。
具体的な使い方は、チュートリアルの SampleOpenRoomRequestの説明を参照のこと。
フレームワークでは、汎用的に使える NestMessage という種類のメッセージをいくつか定義している。
NestMessage は、内部に他の nine::Message を含めることができるメッセージである。内部メッセージは nine::Message のサブクラスなら何でもよく、実質的にどんなメッセージも含めることができる。
extension による既存メッセージの拡張では不十分で、新規メッセージを追加したいような場合は、このメッセージを用いることができる。
現在提供されている NestMessage は以下のものがある:
拡張モジュールにこれらのメッセージを扱う仮想関数が定義されている。NestMessage を使う場合はこれらの関数をオーバーライドして実装する。