HL AsySocket 服务开发框架 - 总体思路与架构

时间:2023-01-07 02:02:57

一 背景

最近在园子了浏览了几篇有关Socket文章,得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocket项目为了希望能够尽快的了解公司这个项目,Google了很多国内外的网站让我对Socket有了更深层次的了解也知道Socket从2.0到4.0发生许多变化,比如在2.0中没有SocketAsyncEventArgs类,大家在园子里把这个类说的这么邪乎,小弟不才有想尝试着使用.NET Framework 4.0 与 Visual Studio 2010也开发一个可扩展多线程异步Socket服务器框架。 为了区分现把AsySocket更名为HL AsySocket Server 也就是框架的名字。

二 Socket概述

在园子里看到很多大师都写的很不错,但是好像也没有几个人真正把这一系列写完,希望自己能够坚持到最后把这一系列写完。也请各位看管监督检查。 废话不说了我们先说说Socket服务器主要关注那些问题,她的出现主要用于提供高效、稳定的数据处理、消息转发等服务,她直接决定了前台应用程序的性能。我们先从整体上认识一下Socket服务器 如图:

HL AsySocket 服务开发框架 - 总体思路与架构

他们之间的关系与流程图 如下:

HL AsySocket 服务开发框架 - 总体思路与架构

上面我们说了Socket服务器主要关心那些问题,我们在来看看Socket应用场景:

HL AsySocket 服务开发框架 - 总体思路与架构

Socket中的 Socket的Send方法,并非大家想象中的从一个端口发送消息到另一个端口,它仅仅是拷贝数据到基础系统的发送缓冲区,然后由基础系统将发送缓冲区的数据到连接的另一端口。值得一说的是,这里的拷贝数据与异步发送消息的拷贝是不一样的,同步发送的拷贝,是直接拷贝数据到基础系统缓冲区,拷贝完成后返回,在拷贝的过程中,执行线程会IO等待, 此种拷贝与Socket自带的Buffer空间无关,但异步发送消息的拷贝,是将Socket自带的Buffer空间内的所有数据,拷贝到基础系统发送缓冲区,并立即返回,执行线程无需IO等待,所以异步发送在发送前必须执行SetBuffer方法,拷贝完成后,会触发你自定义回调函数ProcessSend,在ProcessSend方法中,调用SetBuffer方法,重新初始化Buffer空间。如下图:

HL AsySocket 服务开发框架 - 总体思路与架构

根据上图:

我们需要监控Socket服务器的最大连接数,当前连接数,缓冲区,发送缓存区,接收缓存区 如图:

HL AsySocket 服务开发框架 - 总体思路与架构

三 HL AsySocket Server 整体规划

这次竟然是一次专题学习那就的有一份规划图与愿景图了,知识管理我打算模仿GTD来做,如下

总共分为三大部分:

第一部分也是最重要一部分就是收集与Socket所有相关的文章,示例和开源框架。

第二部分整理收集到的材料,这要取决与第一部分和我自己的数据整理能力,理解能力和写作能力了。

第三部分是分享一些认为自己已经整理出一套特定的解决方案了。

我们先来看看Socket应用环境 如下图:

HL AsySocket 服务开发框架 - 总体思路与架构

Socket服务器的主要核心线程处理流程:

HL AsySocket 服务开发框架 - 总体思路与架构

   客服端连接监听线程

循环侦听远程客户端的Socket连接请求。如果存在,通过适当规范性判断后创建该Socket的客户端会话对象,同时调用该会话对象的Socket异步数据接收方法,接收到的数据包存放在会话对象的包队列中。

   数据包处理线程

循环检测会话对象队列,调用该对象的相关方法完成数据包解析将解包后的消息包抛至业务逻辑层,业务逻辑层收到消息包后,解析消息类型,然后转入相应的处理流程处理。

   会话表检测线程

会话层主要用于记录在线用户信息,该层隶属于业务逻辑层。既然隶属于业务逻辑层,那为什么还要独立出来呢?这主要为以后分布式开发拓展用,试想,一台服务器最大能支持多少人同时在线?中国有多少人?如果1亿人同时在线,你一台服务器能支持得了吗?答案肯定是否定的,所以要分布式开发。分布式开发涉及到用户信息同步的问题,所以会话层就要独立出来了。

Socket异步处理模式

     Socket异步处理模式有两种,第一种是IAsyncResult模式,现在公司用的就是次模式,第二种是SocketAsyncEventArgs模式,这次我打算用SocketAsyncEventArgs来开发。

Socket Server “池”模式

1)Buffer池,用于集中管控Socket缓冲区,防止内存碎片。

2)SAEA池,用于集中管控Socket,重复利用Socket(主要处理发送数据包和接收数据包,并转发给业务逻辑层)。

3)SQL池,用于分离网络服务层与数据访问层(SQL的执行效率远远低于网络层执行效率)。

4)线程池,用于从线程池中调用空闲线程执行业务逻辑,进一步提高网络层运行效率。

四 参考文章

其实整篇文章都是参考园子里的几个高手而来的,以上的一些图片在园子是可以找到,为什么还要自己在画一边主要是想加深理解和学习用的,以下是我在园子里找到几篇认为对Socket服务器思想比较好的文章: