2006 年 12 月 20 日 23 時 53 分

通信コンテキスト


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


RFB は状態(ステート)を持つプロトコルである。

例えば、ProtocolVersion メッセージを交換し、
サーバがクライアントが返したバージョンを認識すれば、
通信に利用するバージョンが確定することになる。
これは、バージョン未定⇒バージョン確定という変化となる。

メッセージは状態に影響を与えるだけではなく、
メッセージ自身が、状態による影響を受けることもある。
クライアントやサーバが送るメッセージは、
状態によって有効であったり無効であったりするのである。

この状態には色々な種類のものがあるため、
色々と変数を用意すると管理が大変となる。

状態は、接続単位でグローバルなものであるため、
処理のあらゆるところで参照される事が想定されるので、
これら状態を一括して管理するクラスがあれば便利だ。

このように総合的な状態を保持するクラスには、
「~Context」という名前をつける事が多い。
ということで、RFBContext という名前にしよう。

========== RFBContext.java ==========

package jp.loafer.rfb;

/**
* RFB の状態を保持するクラス。
* @author kes
*/
public class RFBContext {

    /**
     * 空の通信コンテキストを作成。
     */
    public RFBContext() {
        version = 3003; // 既定のバージョン
    }

    /**
     * 通信中の RFB バージョンを取得。
     * @return RFB バージョン。
     */
    public int getVersion() {
        return version;
    }
    /**
     * 通信中の RFB バージョンを設定。
     * @param version RFB バージョン。
     */
    public void setVersion(int version) {
        this.version = version;
    }

    // RFB の状態

    // 通信バージョン
    private int version;

}

========== end of RFBContext.java ==========

単純に状態に関する情報を集約させたクラスだ。
現在はバージョン値くらいだが、今後間違いなく増える。

バージョンには double 型などを使うのが自然だが、
浮動小数点数型は精度の都合、比較の時に問題が生じる。
そのため、今回はメジャー x 1000 + マイナーで計算する、
int 型にしておくことにしよう。
まあ、専用の RFBVersion クラスを作っても良いのだが、
クラスを増やしすぎるのは好みでない。

状態管理にはいくつもの方法がある。
例えば、状態自体をクラスにしてしまう手もあるが、
俺は構造体っぽいクラスで管理するほうが性に合っている。

コンテキストを作った理由は、状態をクラス間で渡すためだ。
RFBContext のインスタンスをメソッド等に渡すだけで、
簡単に通信状態を共有することができるのである。



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