基于RFB协议 ,使用sliverlight完成远程桌面项目 【图文并茂】-----第一天
最近单位有个项目,基于RFB协议,使用sliverlight 模拟一个远程桌面软件。废话不多 ,开始交流点心得
由于服务器端我们已经采用了 vnc server,所以服务器端编程不再我们考虑的范围中。我们只需要考虑客户端编程即可。
首先我们确定采用异步的socket 编程。汗。。什么年代,肯定用异步的啊 ,呵呵。
这里就需要介绍一个类 叫做 SocketAsyncEventArgs。
接下来我演示一个 用户登入并且去连接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后,给我调用这个方法。
就是那么简单,今天就到这里,明天继续说接下来怎么写。

浙公网安备 33010602011771号