1 / 6
文档名称:

基于完成端口的文件传输设计.doc

格式:doc   大小:15KB   页数:6页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

基于完成端口的文件传输设计.doc

上传人:学习好资料 2022/6/25 文件大小:15 KB

下载得到文件列表

基于完成端口的文件传输设计.doc

相关文档

文档介绍

文档介绍:基于完成端口的文件传输设计
摘要:本文主要讨论使用SocketAsyncEventArgs这个类,利用完成端口并且结合异步事件的方式,设计一个服务端的消息传送中心,从而提高服务器端处理高并发的性能,并避免在异步套接字 I/O 流程,从这里我们可以看出,服务端套接字只是负责监听,一旦有客户端连接,就会把连接事件抛给接收对象;所以客户端一个一个的来,服务端一个一个的抛,性能自然会好了不少。
3 缓冲
说到缓冲,我们很容易理解为一个存储池,里面可以放入东西,也可以拿走。在SocketAsyncEventArgs类中,我们可以利用其SetBuffer方法初始化缓冲区[4]。
比如说:receiveArgs。SetBuffer(new byte[10],0,5);他的意思就是为当前接收数据对象设置的缓冲区大小为10字节,位置从0开始,并且允许接收的最大的数据长度为5字节。
当数据被接收,然后写入到缓冲区的时候,数据会按照预先设定好的缓冲规则进行放置。比如这里我输入aaaaa,那么在缓冲区会放入如下数据:
但是当有新的数据再进来的时候,比如这里我输入了bbbb,那么缓冲区就变成了:
如上图所示,缓冲区中第五位依然是我们前一次插入的值,所以,在这里我提醒大家,缓冲区的东西取完之后,一定要重置一下,否则脏数据会导致数据错误。
讲到这里,也许有人会说,假如我插入aaaaab会怎么样,其实,这个长度已经超过了缓冲区的长度,缓冲区将会做截断处理,然后当作两段放入缓存中,首先会是:
然后会是:
所以如果这个时候你的数据没有被及时取走的话,将会得到最终结果:
这不,已经发生粘包现象了。
4 抛出方式
说完缓冲,这里我们需要说到的是服务端套接字是如何将接收的客户端通过事件的方式抛给SocketAsyncEventArgs对象的。
在进行服务端,我们一般都会有一个用于监听的套接字,套接字会利用serverSocket。AcceptAsync(SocketAsyncEventArgs)异步方法注册SocketAsyncEventArgs对象,然后一旦有客户端连接,就会激发SocketAsyncEventArgs对象的Completed事件,然后,在这个事件中,serverSocket会通过ReceiveAsync(SocketAsync EventArgs)异步方法将数据处理的过程交给另外一个专门负责数据处理的对象去完成,这样,客户端连接,服务端只负责将连接事件抛给SocketAsyncEventArgs对象即可,比起传统的编程方式:服务端既负责监听,又负责接收,效率极大的提升。如图1所示。
5 同步方式
最后说到的是同步问題,因为在异步交互的系统中,同步问题确实很重要,尤其是当客户端和服务器同步的时候。
客户端里面的线程同步,我们可以利用AutoResetEvent来实现,客户端和服务端同步的时候,我们需要AutoResetEvent并且结合一些标记信息来进行,也就是客户端往服务器发送的一些小标记,比如1代表可以进行,0代表取消等等。
在设计的时候,我们还需要记住的是,代码的核心只是负责数据的传输,不要加过多的逻辑判断在里面,否则会