原文:C#高性能大容量SOCKET并发(零):代码结构说明

C#版完成端口具有以下特点:

  • 连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪);
  • 发送数据智能合并(组件会根据资源使用情况,对多个同时发送向同一连接的多个消息数据进行合并写入缓冲区;
  • 内存池管理(提供一系列的接收和发送buffer可复用池);
  • 数据读写封装;
  • 通讯协议封装;

由不同的类负责实现,比MSDN的例子代码多了不少逻辑,为了方便大家阅读和理解,把整体类框架设计整体如下。

类结构图

类说明

  1. AsyncSocketServer:服务入口,建立Socket监听,负责接收连接,绑定连接对象,处理异步事件返回的接收和发送事件;m_asyncSocketUserTokenPool是管理所有空闲的AsyncSocketUserToken,采用栈的管理方式,后进先出;m_asyncSocketUserTokenList是管理所有正在执行的AsyncSocketUserToken,是一个列表;m_logOutputSocketProtocolMgr是LogOutputSocketProtocol的管理对象;m_uploadSocketProtocolMgr是UploadSocketProtocol的管理对象,用于检测是否同时上传同一个文件;m_downloadSocketProtocolMgr是DownloadSocketProtocol的管理对象;m_daemonThread是守护进程,用于关闭超时连接。
  2. AsyncSocketUserToken:用于SocketAsyncEventArgs绑定,保存每个Socket服务对象,包括:m_receiveEventArgs接收数据异步事件;m_asyncReceiveBuffer接收数据异步事件使用的缓存;m_sendEventArgs发送数据异步事件;m_receiveBuffer接收异步事件返回的数据存放缓存,用于后续的分包;m_sendBuffer用于保存发送的数据缓存;m_asyncSocketInvokeElement是用于协议调用的基类,主要实现分包,并发发送的包加到发送列表中,发送完成回调时继续发送下一个包;m_connectSocket是连接的Socket对象。
  3. AsyncSocketInvokeElement:用于协议调用的基类,主要实现分包,并发发送的包加到发送列表中,发送完成回调时继续发送下一个包,包括:m_incomingDataParser用于分析接收到的数据包,把协议解析出命令、关键字、数据,并存储到列表中;m_outgoingDataAssembler用于组装需要发送的数据,把命令、关键字、数据组成符合协议格式的数据,并存储在列表中。
  4. BaseSocketProtocol是所有协议的基类,把一些公共的方法放在这里,后续的ControlSocketProtocol、DownloadSocketProtocol、LogOutputSocketProtocol、RemoteStreamSocketProtocol、ThroughputSocketProtocol、UploadSocketProtocol都从这里继承。

DEMO下载地址:http://download.csdn.net/detail/sqldebug_fan/7467745

免责声明:此代码只是为了演示C#完成端口编程,仅用于学习和研究,切勿用于商业用途。水平有限,C#也属于初学,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com。

C#高性能大容量SOCKET并发(零):代码结构说明的更多相关文章

  1. C#高性能大容量SOCKET并发(转)

    C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs ...

  2. C#高性能大容量SOCKET并发(四):缓存设计

    原文:C#高性能大容量SOCKET并发(四):缓存设计 在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证.有很多服务程序是在启动时申请足够的内存 ...

  3. C#高性能大容量SOCKET并发(十一):编写上传客户端

    原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...

  4. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型

    原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...

  5. C#高性能大容量SOCKET并发(九):断点续传

    原文:C#高性能大容量SOCKET并发(九):断点续传 上传断点续传 断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1:下载开始的时候 ...

  6. C#高性能大容量SOCKET并发(七):协议字符集

    原文:C#高性能大容量SOCKET并发(七):协议字符集 UTF-8 UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 362 ...

  7. C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包

    原文:C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包 守护线程 在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们 ...

  8. C#高性能大容量SOCKET并发(五):粘包、分包、解包

    原文:C#高性能大容量SOCKET并发(五):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一 ...

  9. C#高性能大容量SOCKET并发(三):接收、发送

    原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...

随机推荐

  1. Erlang中的record与宏

    http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据 ...

  2. TensorFlow 学习(十二)—— 高级函数

    tf.map_fn(fn, elems):接受一个函数对象,然后用该函数对象对集合(elems)中的每一个元素分别处理, def preprocessing_image(image, training ...

  3. WatchDog工作原理

    Android系统中,有硬件WatchDog用于定时检测关键硬件是否正常工作,类似地,在framework层有一个软件WatchDog用于定期检测关键系统服务是否发生死锁事件. watchdog的源码 ...

  4. HDU 1244 Max Sum Plus Plus Plus - dp

    传送门 题目大意: 给一个序列,要求将序列分成m段,从左至右每一段分别长l1,l2,...lm,求最大的和是多少. 题目分析: 和最大m段子段和相似,先枚举\(i \in [1,m]\),然后$j \ ...

  5. .NET 即时通信,WebSocket

    .NET 即时通信,WebSocket 即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s ...

  6. wpf控件设计时支持(1)

    原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开发环境下,右侧的Proper ...

  7. 数值范围选择控件RangeSlider

    原文:数值范围选择控件RangeSlider RangeSlider控件用于在一个指定上下限的范围中选择一个数值范围,因此该控件的Maximum和Minimum属性用于指定上下限:而Selection ...

  8. 在.net core 的webapi项目中将对象序列化成json

    问题:vs2017 15.7.6创建一个基于.net core 2.1的webapi项目,默认生成的控制器继承自ControllerBase类 在此情况下无法使用Json()方法 将一个对象转成jso ...

  9. SQLSERVER使用Spring Data JPA实现模糊查询like

    mysql下可以使用 CONCAT函数 @Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:use ...

  10. golang中jwt使用

    golang 中jwt使用方式总结. 1. golang示例代码 import ( "fmt" "time" "github.com/dgrijalv ...