理解NetworkSocket之SockAsync<TDataEvenArgs>

前言

前面给出了几个例子如何使用NetworkSocket构建服务和客户端,但没有详细说明过NetworkSocket里的设计思路,以及几个重要对象的说明,本节将解说NetworkSocket里的最基础最重要的SocketAsync<TDataEventArgs>类。

类图

设计思路

性能:服务器一个重要的参考点就是拼性能,SocketAsync也使用了SocketAsyncEventArgs对象作发送和接收数据,为了防止缓冲区内存碎片化,我们需要把该对象的缓冲区统一放到一块连续的内存区域,对应上图的SocketAsncBufferManage,

方便:SocketAsync的目标是,给我一个Socket,我就可以控制它让它发送和接收数据,发送数据的方法是Send(byte[] buffer),接收到数据通知上层调用者是OnRecvComplete事件,该事件的第一个参数sender是SocketAsync<TDataEventArgs>类型。

灵活:SocketAsync不依赖于具体的封包方法(协议),将变化的协议通过TDataEventArgs做为泛型参娄传进来,提供protected virtual TDataEventArgs AnalysisRecvData(ByteBuilder recvBuilder)方法,给派生类重写解析数据;同时提供internal Func<ByteBuilder, TDataEventArgs> AnalysisRecvDataHandler { get; set; }的委托, 可以让调用者可以把解析方法赋值给它,在设计TcpServerBase<TDataEventArgs>对象时,我们就需要到这个委托。

细节提示

SocketAsyncEventArgs在发送数据时比较难以驾驭,在发送未完成时,如果继续调用它,则引发异常,在实现SocketAsync时,如果发送的数据大于发送缓冲区,需要把数据拆开,发送第一小包完之后,才可以发送第二个小包,依此类推。

原文地址:https://www.cnblogs.com/kewei/p/3020415.html