このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
イベント駆動段階に移行した後は、
操作等によって起こったイベントに応じて、
クライアントがメッセージをガンガン送ってくる。
クライアントメッセージの長さは可変であるため、
長さに応じてメッセージの区切りを適切に扱うためには、
サーバがメッセージの定義を知っている必要がある。
そのため、例えサーバが一部のイベントしか必要としなくとも、
RFB で定義されている基本的なクライアントメッセージを
全て理解して処理する必要があることになる。
基本的なクライアントメッセージは 7 個あるため、
これらに対応したクラスを準備する必要がある。
今回は Message インタフェースを直接実装せず、
これを拡張した ClientMessage インタフェースを作り、
それを実装させることにしよう。
ということで、まず ClientMessage インタフェースを作る。
========== ClientMessage.java ==========
package jp.loafer.rfb.message.client;
import jp.loafer.rfb.message.Message;
/**
* クライアントがサーバに送る通常メッセージ。
* @author kes
*/
public interface ClientMessage extends Message {
/**
* 画像フォーマットの設定メッセージ。
*/
public static final int SET_PIXEL_FORMAT = 0;
/**
* カラーテーブルの設定メッセージ。(実験的・3.7 で廃止)
*/
public static final int FIX_COLOR_MAP_ENTRIES = 1;
/**
* エンコーディングの設定メッセージ。
*/
public static final int SET_ENCODINGS = 2;
/**
* フレームバッファの更新要求メッセージ。
*/
public static final int FRAMEBUFFER_UPDATE_REQUEST = 3;
/**
* キー入力メッセージ。
*/
public static final int KEY_EVENT = 4;
/**
* ポインタ入力メッセージ。
*/
public static final int POINTER_EVENT = 5;
/**
* クライアント側コピーメッセージ。
*/
public static final int CLIENT_CUT_TEXT = 6;
/**
* メッセージの種類を取得。
* @return メッセージの種類。
*/
int getType();
}
========== end of ClientMessage.java ==========
Message インタフェースとそれほど差はなく、
単にクライアントメッセージの種類を取得する、
getType メソッドを追加しただけだ。
クライアントメッセージのクラスは、
Message の代わりに ClientMessage を実装し、
getType の定義を用意すればいいわけだ。
また、あまりよい事ではないのだが、
メッセージの種類を表す定数も同時に定義しておいた。
定数 に Enum を使う手もあったのだが、
Java の Enum はより高水準に設計されているため、
タイプセーフな「整数」として使うには少し面倒なのだ。