このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
メイン処理を RFBHandler だけで表現するには厳しいので、
上位水準のクラスを抽出していこう。
メイン処理においては、クライアントとサーバは、
任意にメッセージを交換するモードに突入する。
普通にメイン処理を実装した場合、
RFBInputStream からメッセージを読み出し、
その種類に基づいて処理を行うことになる。
この段階では、クライアントが送るメッセージに順番がない。
そのため、サーバがメッセージを読み出す際には、
RFBInputStream の先読みを利用して種類を判別し、
それに応じた適切なインスタンスを読み出す必要がある。
また、サーバはメッセージを読み出した後、
それに応じた処理を行うことになるので、
結果的に switch 等で分岐することになる。
恐らくここまではほとんどのサーバ実装で必要になるはずだ。
そこで、メッセージの読み出しを行い、
種類に応じてメソッドに振り分けるクラスを作ればよい。
まずは、サーバ側の仮想画面を表すインタフェースを作る。
========== RFBDisplay.java ==========
package jp.loafer.rfb.server;
import java.io.IOException;
import jp.loafer.rfb.RFBContext;
import jp.loafer.rfb.io.RFBOutputStream;
import jp.loafer.rfb.message.PixelFormat;
import jp.loafer.rfb.message.client.*;
/**
* サーバ側主処理を表すインタフェース。
* @author kes
*/
public interface RFBDisplay {
/**
* 仮想画面の初期化。
* @param context 通信コンテキスト。
* @param out 出力用ストリーム。
* @throws IOException 入出力エラー。
*/
void initialize(RFBContext context, RFBOutputStream out) throws IOException;
/**
* 仮想画面の幅を取得。
* @return 仮想画面の幅。
*/
public int getWidth();
/**
* 仮想画面の高さを取得。
* @return 仮想画面の高さ。
*/
public int getHeight();
/**
* 仮想画面の名前を取得。
* @return 仮想画面の名前。
*/
public String getName();
/**
* 仮想画面の既定の画素形式を取得。
* @return 仮想画面の既定の画素形式。
*/
public PixelFormat getDefaultPixelFormat();
/**
* SetPixelFormat メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleSetPixelFormat(SetPixelFormatMessage message) throws IOException;
/**
* FixColourMapEntries メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleFixColorMapEntries(FixColorMapEntriesMessage message) throws IOException;
/**
* SetEncodings メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleSetEncodings(SetEncodingsMessage message) throws IOException;
/**
* FramebufferUpdateRequest メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleFramebufferUpdateRequest(FramebufferUpdateRequestMessage message) throws IOException;
/**
* KeyEvent メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleKeyEvent(KeyEventMessage message) throws IOException;
/**
* PointerEvent メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handlePointerEvent(PointerEventMessage message) throws IOException;
/**
* ClientCutText メッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleClientCutText(ClientCutTextMessage message) throws IOException;
/**
* 未知のメッセージの処理。
* @param message メッセージ固有のデータ。
* @throws IOException 入出力エラー。
*/
void handleCustomMessage(ClientMessage message) throws IOException;
}
========== end of RFBDisplay.java ==========
RFBDisplay は初期化時に使うサーバの属性取得メソッドと、
クライアントから受け取ったメッセージを処理する、
個別の処理系メソッドを持つ。
このインタフェースを使ってサーバを実装すれば、
メッセージの読み取り処理の実装を分離する事ができる。