このアーカイブは同期化されません。 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 クライアントが既定の表示をしてくれたようだ。