KonsanNet 网络通信框架实现(第一章)— 架构设计

源码地址

      GitHub:https://github.com/KonsanAlide/KonsanNet

章前阐述

      这一章主要讲的是整个框架的设计思路,其实主要是服务器端部分,这一部分在博客上有很多人讲过,思路上大都相似,只是细节上有所不同,虽然这细节偏偏是决定了性能的关键性,不过本章不深入分析这些细节,只阐述架构,原因如下:

       一、因为这Version0.2只是居于经验,仅把架构设计、线程模型、模块层次、逻辑流程、基本的消息通信这几块走通,实现初步稳健的架构、准确的数据传输、会话管理、错误处理,性能方面暂时未经过大量调整和测试,后期会有这方面的内容;              

       二、这个框架初步来讲,仅是一个通用性框架,实现的时间有限,能力有限。一般来讲,能满足普通的单服务器节点的大规模数据传输,这是一个Open的架构,如果对性能或者效率上有很多要求,大家也需要在自己的业务环境中进行一定的调整,相信这一点对大都有几年的网络通信开发经验的通信来讲,都不困难,需要的是大量的测试和细微的调整。通过本框架代码,提供给大家一些基础的架构模块,希望能给大家带来一些方便:当需搭建这样一套系统的时候,无需再花费大量时间从头实现,仅需要进行一定的调整和业务逻辑部分的编码实现即可。

       三、网络通信的细节问题,在论坛和博客上有很多人反复的讨论解决过,我并不见得比他们更优秀。

架构设计说明

       下面我们接上昨天前文,来说明下这个框架的设计架构。

       服务端(CXCommunicationServer):目前兼容Windows和Linux两个平台,Windows使用IOCP,linux使用epoll,大约分了四层(时间精力都有限的情况下,这里面的层次划分其实并不非常明显):内核IO通信层、数据包解析层、会话管理层、用户消息处理层。

       客户端(CXCommunicationClient):目前兼容Windows和Linux两个平台,包含基础的SOCKET封装类,包含消息通信类,文件传输客户端类,多线程测试函数。下来要增加会话管理类。未来如时间允许,P2P实现、UDP实现也会逐渐加入到里面来。

       内存管理模块(CXMemoryCache):目前初步实现一个简单的内存链表(slab)来做一个内存池对象,实现一个内存池对象管理类。

       其它模块:其它模块皆为辅助功能,不单独讲,在后文阐述的过程中会涉及一些。

 

服务端(CXCommunicationServer)架构设计

内核IO通信层

       内核IO通信层,主要是对IOCP和EPOLL模型接口的封装,把工作线程和监听线程封装在一起。这里我这一版本暂时用独立的监听线程来Accept连接,而不是加入到模型中通过工作线程来统一处理,原因很简单:时间有限,而且想和后面的去掉监听线程的版本进行一些比较,让大家更直观的看到两者区别,其次,在大部分的同学的业务场景中,这种模式可能会更简单好操作一些。

      该层主要是实现类是CXSocketServerKernel,该类的实现逻辑也简单:

      通过Start函数来创建监听的socket,启动监听线程,启动多个工作线程;

      监听线程ListenThread 循环的等待Accept socket链接,触发OnAccept事件,把socket抛到CXCommunicationServer来处理,申请CXConnectionObject资源、分配消息处理队列、分配内存池资源等,把socket加入到IOCP和EPOLL模型中,通知模型等待接收数据。

       工作线程WaitThread循环的等待socket的IO事件(目前版本只等待接收数据事件),接收到事件后,处理异常情况,把正确的Receive事件抛给CXCommunicationServer的OnRecv来处理。

 

        备注:CXCommunicationServer类是服务端的管理类,协调启动各大模块并进行中间处理。

数据包解析层

        数据包解析层,包含两个工作:数据包解包(排序、加解密、解压),数据包分发。

   CXCommunicationServer类接收内核IO层CXSocketServerKernel抛出来的事件,把Receive事件抛给CXConnectionObject来处理。

        CXConnectionObject类是连接封装对象,处理收发包、排序、组包拆包、加解密、加解压等数据处理逻辑的,当然这块的功能也可以抽到一层独立的数据处理层来弄,开始设计时我是如此考虑的,但开发中时间一赶,就全塞到这类里面来了,而且数据校验、加解密、加解压还没实现。

      数据分发模块,CXDataDispathLevelImpl、CXMessageQueue、CXMessageProcessLevelBase是属于这一部分的,CXConnectionObject把拆解出来消息包通过直接放入CXDataDispathLevelImpl中CXMessageQueue对象中,CXDataDispathLevelImpl有多个CXMessageQueue对象,CXMessageProcessLevelBase是线程对象,有多个,CXMessageProcessLevelBase从CXMessageQueue中不停的获取消息包并抛到会话层和用户消息处理层来处理。

 

会话管理层

       在本框架里面会话是一个用户的身份对象,该用户不是业务层上的普通用户,而是针对一个客户端来讲的,一个会话里面包含一个及以上的链接对象CXConnectionObject,包含一个会话ID,和一些会话缓存。

       计划中会话使用租期管理,一个客户端中的多个Socket链接使用同一个会话,链接时需要进行合法验证。有一个主消息的链接对象、次要消息链接对象、数据传输链接对象、RPC链接对象等,每一种对象代表一种基础的传输协议封装,所传输的数据的大小可能不同,所以CXConnectionObject中提供了一大一小两个CXMemoryCache指针来申请释放不同大小的内存。

   这一部分的主要类是CXSessionLevelBase、CXSessionMessageProcess、CXSessionsManager、CXConnectionSession。

       目前CXSessionMessageProcess类中对socket链接发过来的第一个包进行会话验证和处理。

 

       

用户消息处理层

       在本框架里面这一层目前做得很简单,只有CXUserMessageProcess一个类,而且目前只简单的实现文件下载功能。这一部分等待使用者自由扩展,而且可以使用protobuf等第三方对象封装传输协议,也可以实现RPC,请自由发挥。

 客户端(CXCommunicationClient)

       客户端部分目前实现的有些简单,只包含基础的SOCKET封装类,包含消息通信类,文件传输客户端类,多线程测试函数。这一部分目前逻辑简单,我不详细说明,大家直接测试一下,立马明白。下来要增加的是会话管理类,在会话中增加多个链接。未来如时间允许,P2P实现、UDP实现也会逐渐加入到里面来。

 

最后

 

       突然想起来,可能有些同学想要知道下该代码如何编译,很简单:

       把代码下载下来后,在CXCommunicationServer等文件夹所在的目录下建一个build文件夹,命令行中cd到这个build文件夹里面,用“cmake .. ”即可构建好工程,Windows和Linux皆同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值