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

一 背景c#

        最近在园子了浏览了几篇有关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服务器 如图:网络

image

他们之间的关系与流程图 以下:多线程

image

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

image

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

image

 

根据上图:异步

     咱们须要监控Socket服务器的最大链接数,当前链接数,缓冲区,发送缓存区,接收缓存区 如图:分布式

image

三 HL AsySocket Server 总体规划函数

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

总共分为三大部分:

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

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

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

咱们先来看看Socket应用环境 以下图:

image

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

image

   客服端链接监听线程

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

   数据包处理线程

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

   会话表检测线程

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

Socket异步处理模式

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

Socket Server “池”模式

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

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

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

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

四 参考文章

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

相关文章
相关标签/搜索