nintenyun

导航

基于RFB协议 ,使用sliverlight完成远程桌面项目 【图文并茂】-----第一天

最近单位有个项目,基于RFB协议,使用sliverlight 模拟一个远程桌面软件。废话不多 ,开始交流点心得

由于服务器端我们已经采用了 vnc server,所以服务器端编程不再我们考虑的范围中。我们只需要考虑客户端编程即可。

首先我们确定采用异步的socket 编程。汗。。什么年代,肯定用异步的啊 ,呵呵。

这里就需要介绍一个类 叫做 SocketAsyncEventArgs。

MSDN解释:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(SYSTEM.NET.SOCKETS.SOCKETASYNCEVENTARGS);k(SOCKETASYNCEVENTARGS);k(TargetFrameworkMoniker-%22SILVERLIGHT%2cVERSION%3dV3.0%22);k(DevLang-CSHARP)&rd=true

接下来我演示一个 用户登入并且去连接VNC SERVER的模拟程序:

界面(由于版权,我使用了其他人写完的界面):

业务流图:

简单解释一下:从登入界面,用户输入ip和port后(先不涉及到密码验证),根据RBF协议 第一步要做的是握手,就是客户机和服务器建立socket连接。

用户点击 connect 按钮后,触发事件调用connect的方法 ,去连接服务器,然后连接上后要读服务器的版本信息,最后显示出来。

接下来我来解读一下 Connect()方法

 public void Connect(Action completed)
        {
            SocketAsyncEventArgs sae = new SocketAsyncEventArgs();
            sae.RemoteEndPoint = new DnsEndPoint(this.Host, this.Port);  //客户机和服务器机建立连接
            sae.Completed += (s, e) =>  //如果监听到有客户机连接上,就触发一下方法
            {
                if (sae.SocketError == SocketError.Success) 
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() => completed());
                }
           
            };
            this.Socket.ConnectAsync(sae); //开始通讯
        }

 对照着我理解的Socket模型 给大家解释下以上代码

SocketAsyncEventArgs sae = new SocketAsyncEventArgs(); //客户机在自己任意端口 Any port 建立一个socket
sae.RemoteEndPoint = new DnsEndPoint(this.Host, this.Port);//告诉客户机你要连接的地址和端口,这里我们要连接 10.225.100.1的5900端口

 

this.Socket.ConnectAsync(sae);  //建立连接

  

 sae.Completed += (s, e) =>  //这里的意思是尚若Server端(对应图)的监听在5900端口上的监听器发现有客户机连接上来。
{ //并且连接完毕后,触发回调事件
..................
}

  看到这里,大家也许会觉得有点迷糊了。我来举个通俗的例子。

      比如单位里,你要批准一个项目,需要经理签字。一个部门20个人,经理就一个。尚若这个经理室个工作狂。他能够并发给你们处理签字。

      这里你可以把经理比作Server,部门员工就是19个Client.

      员工小张他要求批准一个项目,他请求经理:喂,老大,帮我批准以下。此时,员工小猫也要同时批准一个项目,也需要签字。可是那我说了这经理是个工作狂

      他能够同时吞吐2个请求,如下图

      

这也就是为什么要使用SocketAsyncEventArgs 的原因了,比如 sae.Completed += (s, e) => {} 如果引申到本图就是,小张和小猫同时拿到经理的approve事件后,调用下一步申请经费()方法。

好,继续解释最后的代码

 
 sae.Completed += (s, e) =>  //如果监听到有客户机连接上,就触发一下方法
            {
                if (sae.SocketError == SocketError.Success) //如果socket连接成功
                {
                    Deployment.Current.Dispatcher.BeginInvoke(() => completed());  //方法 Connect(Action completed) 接受的参数是一个代理,因此可以传入方法。比如“若连接成功,那么我就读服务器信息"
                }
              
            };

  也就是说 Connect(Action completed) ,我这里可以传入一个申请经费()方法。然后等到经理approve后,给我调用这个方法。

就是那么简单,今天就到这里,明天继续说接下来怎么写。

posted on 2011-07-26 17:42  nintenyun  阅读(1217)  评论(0)    收藏  举报