2006 年 12 月 30 日 22 時 35 分

いよいよ画面を出す


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


[写真]


やっとメッセージクラスの設計が終わった。
これで準備が整ったので、いよいよ画面を出してみよう。

では、RFBSession クラスを修正しよう。

========== RFBSession#execute ==========

    /**
     * RFB プロトコルの開始点。
     * @param in 汎用入力ストリーム。
     * @param out 汎用出力ストリーム。
     * @throws IOException 入出力エラー。
     */
    public void execute(InputStream in, OutputStream out) throws IOException {

        // 基本オブジェクトの用意
        RFBContext context = new RFBContext();
        RFBInputStream rin = new RFBInputStream(in);
        RFBOutputStream rout = new RFBOutputStream(out);

        // ProtocolVersion ハンドシェイク
        processProtocolVersion(context, rin, rout);

        // Security ハンドシェイク
        processSecurity(context, rin, rout);

        // メイン処理
        processMain(context, rin, rout);

    }

========== end of RFBSession#execute ==========

execute メソッドには、
processMain メソッドの呼び出しを追加しただけだ。

========== RFBSession#processMain ==========

    // メイン処理
    private void processMain(RFBContext context,
            RFBInputStream in, RFBOutputStream out) throws IOException {
       
        // 初期化
        {
            // ClientInit
   
            ClientInitMessage client = in.readMessage(
                    context, ClientInitMessage.class);

            // TODO: 共有接続のフラグによって挙動を変える
            // client.isShared();
           
            // ServerInit
   
            PixelFormat format = new PixelFormat(
                    32, 24, true, true, 0xff, 0xff, 0xff, 16, 8, 0);
           
            ServerInitMessage server = new ServerInitMessage(
                    300, 200, format, "VNC Test Server");
           
            out.writeMessage(context, server);
            out.flush();
        }

        // とりあえず無限ループ ^^;
        for (;;) {
            in.readU8();
        }

    }

========== RFBSession#processMain ==========

まずは ClientInit メッセージを読み取る。
ClientInit には共有に関するフィールドがあるため、
サーバが必要に応じて他の接続を切断する等の処理を行う。

続いて ServerInit メッセージを送る。
今回は、テストとして、300 x 200 の画面と、
標準的な 24 ビット RGB としてみた。
セッション名は、「VNC Test Server」とする。

初期化が終わると、メッセージ駆動式の無限ループに入る。
ここではまだ何の処理も行わずに、
クライアントの送信データを読み捨てるだけにしておく。

これで実行してみると、写真のような画面が出た。

現状の実装ではサーバが画素データを返していないが、
RealVNC クライアントが既定の表示をしてくれたようだ。



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