VNCクライアントの実装





かなり前に、Silverlight 3.0のみが利用可能で、より良い時期が来るまでそれを棚に置いたコードを書いたのは認めます。 ソケットの使用により、すべての作業が複雑になりました。承認サーバーが必要だったため、一般的に、ポートでそのような災害が発生しました。



最後に、Silverlight 4.0を最初に垣間見た後、私はほこりっぽいコードを手に入れ、この機能を人々に、そしてすべてのおかげでブラウザの外でアプリケーションを起動する(OOB)ことを決めました。 これでソケットでリラックスでき、アプリケーションは完全に信頼できるものとしてインストールされ、ソケットに基づくサービスを自由に使用でき、ポリシーサーバーは不要になりました。



そのため、RealVNC Webサイトで見つけることができる仕様とともに、リモートフレームバッファプロトコル(RFB)の基本的な実装であるSilverVNCに注目します。 プロトコルは、UltraVNCの最新バージョンを使用して実装されました。



私が言ったように、実装は基本です。 商用バージョンとは異なり、RAWエンコードのみをサポートし、圧縮は一切使用しません。より難しい。 そこで、ユーザーにその仕組みの簡単な例を提供することにしました。



動作原理



この例の中核はRfbClientクラスですこれは、サーバーとの通信、データのデコード、およびユーザーインターフェイスへのイベント送信に必要なすべてのロジックをカプセル化します。 このクラスは、データを送受信するソケットで構成されます。 RFBプロトコルの仕様の説明はこの記事に含まれていないため、クラスの詳細には触れません。 OOBのおかげで、アプリケーションは許可なしに任意のポートでソケットを開くことができることを知っておく必要があります。



アプリケーションのメインページは、RfbClientを使用してVNCサーバーに接続し、そこからデータを取得してデコードします。 RfbClientが何かを受け取るたびに、2種類のイベントが発生します。



ResizeFrameBuffer-サーバーは画面サイズの変更を通知しました。 これは通常、接続の開始時に行われるため、クライアントは描画領域のサイズを変更します。



FramBufferUpdate-サーバーは画面上の変更を検出し、変更されたセクションを切り取り、サーバーに転送しました。 イベントハンドラーは、描画可能領域上の正方形の位置を計算し、画面に表示しました。



これらのイベントを処理する例を次に示します。



void Client_ResizeFrameBuffer( object sender, EventArgs e)

{

this .MakeWindowProportional( this .Client.Server.Width, this .Client.Server.Height);

this .BitMap = new WriteableBitmap( this .Client.Server.Width, this .Client.Server.Height);

this .vnc.Source = this .BitMap;

}



private void MakeWindowProportional( double width, double height)

{

double proportion = width / height;

Application.Current.MainWindow.Height = Application.Current.MainWindow.Width / proportion;

Application.Current.MainWindow.Activate();

}



private void Client_FrameBufferUpdate( object sender, FrameBufferUpdateEventArgs e)

{

Rect rect = e.Rectangle;



int x = 0;

int y = 0;



foreach ( uint color in e.Colors)

{



this .BitMap.Pixels[

(y + ( int )rect.Y) *

this .Client.Server.Width +

(x + ( int )rect.X)] = ( int )color;



if (++x == rect.Width)

{

x = 0;

y++;

}

}



this .BitMap.Invalidate();

}






次は?



私は、すぐにいくつかの機能と改善を追加すると思います。 まず第一に、私はバッファに書き込むためのアルゴリズムを書くことを考えています;それは上記のコードよりも効率的でなければなりません。 私の考えは、MediaStreamSourceを実装して、MediaElementに接続できるビデオストリームを提供することです。 これは、パフォーマンスだけでなく、リモートデスクトップビューアーをアプリケーションに追加する必要のある開発者にとっても使いやすいという点で優れているはずです。



別の改善点は、異なる圧縮アルゴリズムの実装です。 たぶん、RRE、CoreRRE、Hexを実装しています。 最後に、リモートデスクトップを表示するための完全に機能するアプリケーションにビューアを開発したいと考えました。 理論的には、これを行うのは難しくありません。



それまでの間、現在のアプリケーションを試してみて、フィードバックをお聞きください。



ソースコード: http : //www.silverlightplayground.org/assets/sources/SilverlightPlayground.RFB.zip

ビデオ: http : //www.silverlightplayground.org/assets/video/SilverVNC.wmv

RFB仕様: RFBプロトコル



ソース-Silverlight Playground



All Articles