2007 年 1 月 29 日 23 時 7 分

RFBSession のダイエット & 動作テスト


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


では、メッセージがどう流れるかテストしてみよう。

以前と同じく RFBSession を使うのだが、
これはだいぶダイエットできたはずだ。

========== RFBSession ==========

package jp.loafer.rfbdemo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import jp.loafer.rfb.RFBContext;
import jp.loafer.rfb.io.RFBInputStream;
import jp.loafer.rfb.io.RFBOutputStream;
import jp.loafer.rfb.server.BaseRFBDisplay;
import jp.loafer.rfb.server.MessageDispatcher;
import jp.loafer.rfb.server.ProtocolVersionHandshake;
import jp.loafer.rfb.server.RFBDisplay;
import jp.loafer.rfb.server.SecurityHandler;
import jp.loafer.rfb.server.SecurityHandshake;
import jp.loafer.rfb.server.VNCAuthenticationHandler;

/**
* RFB プロトコルの処理。
* @author kes
*/
public class RFBSession {

    /**
     * {@link RFBSession} のインスタンスを作成。
     */
    public RFBSession() {
        // 処理不要
    }

    /**
     * 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);

        // テスト用の値
        int serverVersion = 3007; // 3.7
        SecurityHandler securityHandler
                = new VNCAuthenticationHandler("password");

        // ProtocolVersion ハンドシェイク
        {
            ProtocolVersionHandshake handshake
                    = new ProtocolVersionHandshake(serverVersion);
            handshake.execute(context, rin, rout);
        }

        // Security ハンドシェイク
        {
            SecurityHandshake handshake = new SecurityHandshake(securityHandler);
            handshake.execute(context, rin, rout);           
        }

        // メイン処理
        {
            RFBDisplay display = new BaseRFBDisplay(300, 200, "VNC Test Server");
            MessageDispatcher dispatcher = new MessageDispatcher(display);
            dispatcher.execute(context, rin, rout);
        }

    }

}

========== end of RFBSession ==========

ハンドシェイクや各種ハンドラを分離したことで、
非常にすっきりとしたクラスになった。

では、ちょっと実行してみよう。
いまだに画面は真っ黒(いつまで掛かるんだ?)だが、
送られたメッセージの詳細が分かるようになった。

jp.loafer.rfb.message.client.SetPixelFormatMessage[format=jp.loafer.rfb.message.PixelFormat[bitPerPixel=32,depth=24,bigEndian=false,trueColor=true,redMax=255,greenMax=255,blueMax=255,redShift=16,greenShift=8,blueShift=0]]
jp.loafer.rfb.message.client.SetEncodingsMessage[encodingTypes=[-239, -223, 16, 1, 5, 2, 0]]
jp.loafer.rfb.message.client.FramebufferUpdateRequestMessage[incremental=false,x=0,y=0,width=300,height=200]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=65505]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=35]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=35]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=65505]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=9,y=19]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=12,y=21]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=22,y=22]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=36,y=24]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=40,y=26]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=41,y=26]
jp.loafer.rfb.message.client.PointerEventMessage[mask=1,x=41,y=26]
jp.loafer.rfb.message.client.PointerEventMessage[mask=0,x=41,y=26]
jp.loafer.rfb.message.client.ClientCutTextMessage[text=テキスト]]



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