源码地址
GitHub:https://github.com/KonsanAlide/CXCommunicationFramework
章前阐述
这一章主要讲的是整个框架的设计思路,其实主要是服务器端部分,这一部分在博客上有很多人讲过,思路上大都相似,只是细节上有所不同,虽然这细节偏偏是决定了性能的关键性,不过本章不深入分析这些细节,只阐述架构,原因如下:
一、因为这Version0.2只是居于经验,仅把架构设计、线程模型、模块层次、逻辑流程、基本的消息通信这几块走通,实现初步稳健的架构、准确的数据传输、会话管理、错误处理,性能方面暂时未经过大量调整和测试,后期会有这方面的内容;
二、这个框架初步来讲,仅是一个通用性框架,实现的时间有限,能力有限。一般来讲,能满足普通的单服务器节点的大规模数据传输,这是一个Open的架构,如果对性能或者效率上有很多要求,大家也需要在自己的业务环境中进行一定的调整,相信这一点对大都有几年的网络通信开发经验的通信来讲,都不困难,需要的是大量的测试和细微的调整。通过本框架代码,提供给大家一些基础的架构模块,希望能给大家带来一些方便:当需搭建这样一套系统的时候,无需再花费大量时间从头实现,仅需要进行一定的调整和业务逻辑部分的编码实现即可。
三、网络通信的细节问题,在论坛和博客上有很多人反复的讨论解决过,我并不见得比他们更优秀。
架构设计说明
下面我们接上昨天前文,来说明下这个框架的设计架构。
服务端(CXCommunicationServer):目前兼容Windows和Linux两个平台,Windows使用IOCP,linux使用epoll,大约分了四层(时间精力都有限的情况下,这里面的层次划分其实并不非常明显):内核IO通信层、数据包解析层、会话管理层、用户消息处理层。
客户端(CXCommunicationClient):目前兼容Windows和Linux两个平台,包含基础的SOCKET封装类,包含消息通信类,文件传输客户端类,多线程测试函数。下来要增加会话管理类。未来如时间允许,P2P实现、UDP实现也会逐渐加入到里面来。
内存管理模块(CXMemoryCache):目前初步实现一个简单的内存链表(slab)来做一个内存池对象,实现一个内存池对象管理类。
其它模块:其它模块皆为辅助功能,不单独讲,在后文阐述的过程中会涉及一些。
服务端(CXCommunicationServer)架构设计
内核IO通信层
备注:CXCommunicationServer类是服务端的管理类,协调启动各大模块并进行中间处理。
数据包解析层
数据包解析层,包含两个工作:数据包解包(排序、加解密、解压),数据包分发。
CXCommunicationServer类接收内核IO层CXSocketServerKernel抛出来的事件,把Receive事件抛给CXConnectionObject来处理。
CXConnectionObject类是连接封装对象,处理收发包、排序、组包拆包、加解密、加解压等数据处理逻辑的,当然这块的功能也可以抽到一层独立的数据处理层来弄,开始设计时我是如此考虑的,但开发中时间一赶,就全塞到这类里面来了,而且数据校验、加解密、加解压还没实现。
数据分发模块,CXDataDispathLevelImpl、CXMessageQueue、CXMessageProcessLevelBase是属于这一部分的,CXConnectionObject把拆解出来消息包通过直接放入CXDataDispathLevelImpl中CXMessageQueue对象中,CXDataDispathLevelImpl有多个CXMessageQueue对象,CXMessageProcessLevelBase是线程对象,有多个,CXMessageProcessLevelBase从CXMessageQueue中不停的获取消息包并抛到会话层和用户消息处理层来处理。
会话管理层
用户消息处理层
客户端(CXCommunicationClient)
最后
突然想起来,可能有些同学想要知道下该代码如何编译,很简单:
把代码下载下来后,在CXCommunicationServer等文件夹所在的目录下建一个build文件夹,命令行中cd到这个build文件夹里面,用“cmake .. ”即可构建好工程,Windows和Linux皆同。