一种后台网络服务器模型

       这里描述一种后台网络服务器模型,其中涉及到侦听线程,缓冲线程,业务处理线程。侦听线程循环等待客户端的连接,一旦有客户端连接上来,就将客户端socket加入到socket队列中,缓冲线程负责循环等待客户端socket 的读信息。缓冲线程中的客户端socket就是侦听线程提供的。缓冲线程可以有多个。侦听线程和缓冲线程共同维护socket队列。

        这里解释一下为什么要开多个缓冲线程。因为我们采用了select 这种 I/O 复用模型,select 在管理大量 socket的时候,在Windows 上,虽然可以通过重新定义 FD_SETSIZE 来使其能够管理大量socket,但是效率相对较低,而在linux上面,select 有FD_SETSIZE的限制,数量多了还不行。所以这里开启多个缓冲线程,每个缓冲线程里面调用select 函数,这样,管理的 socket 数量能够增加几倍,达到   n * FD_SETSIZE。在 socket 的维护中,缓冲线程之间不需要同步,因为他们各自维护了一个 socket队列,缓冲线程只和侦听线程需要同步维护socket。

       前面提到缓冲线程负责循环等待客户端socket 的读信息,当客户端socket 有读信息的时候,缓冲线程会为该客户端寻找空闲的 业务处理线程。这里采用线程池的方式来管理业务线程。如果缓冲线程能够找到空闲的业务线程,则把 当前socket 交给该空闲的业务线程,如果没找到,则创建 业务处理线程池。所以,缓冲线程 和 业务处理线程需要同步业务处理线程的工作状态,是空闲,还是正在忙于处理客户端socket 。

      下面给出这种网络服务器模型的时序图:

       

      

 

    如上图,ListenThread负责侦听客户端的连接,当有客户端连接上来时,接受socket,并且发送消息3add socketInfo,将socketinfo增加到 m_sockCacheList[nIndex]中。nIndex表示缓冲线程的线程索引,取值可以为[1…n]ListenThreadsocket总数对缓冲线程总数取模来决定当前socket加入到哪个缓冲线程中。

    缓冲线程对自己m_sockCacheList[nIndex]中的socket循环检查是否有数据可读。若有数据可读,则为客户端寻找空闲的TradeThread(或者创建TradeThread,发送消息5Create TradeThread),接着发送消息6Delete socketInfo,socketInfo从自己内部的m_sockCacheList[nIndex]移除。

TradeThread,侦听客户端的请求操作,并且根据业务规则,做相应处理。当发现客户端在规定的时间内无反应时,发送消息:5:3Delete socketInfo,scoketInfo删除。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值