2007 年 1 月 2 日 23 時 47 分

ClientMessage インタフェース


このアーカイブは同期化されません。 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 はより高水準に設計されているため、
タイプセーフな「整数」として使うには少し面倒なのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.