IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    tigase网络核心SockThread详解

    五四陈科学院发表于 2014-07-09 16:03:33
    love 0

    以下内容由[五四陈科学院]提供

    总述

    • SocketThread类是一个很底层的类,在初始化时调用了Selector.open(clientsSel)。
    • socketReadThread nThread个
    • socketWriteThread nThread个
    • ResultsListener nThread个
    • completionService一个,池化线程nThread个,在sockThread.run里被submit,ResultsListener里进行completionService.take().get()取出执行结果。
    • forCompletion有序队列一个,在socketThread.run里开始add,同一方法立即被从最小依次取出,然后submit给completionService。
    • waiting有序队列一个,recreateSelector阶段存在add,最大来源是addSocketService静态方法,在socketThread.run最后阶段的addAllWaiting时注册Channel时把waiting里的IOService取出做为附加对象绑定。

    重点方法

    • 主方法+两个有序队列,一个是等待处理队列,一个是完成队列。
    • forCompletion完成队列里的内容,交由具体的completionService完成后,由ResultListener相关线程处理最终结果。
    • 主方法:addSocketService。先判断是等发还是等收,取模进入对应的处理线程的wait队列。对应线程会由addAllWaiting触发网络绑定,主线程的死循环捕捉事件进行分发给completionService的动作。
    • addSocketService的IOService,应该是永远waitingToRead,有时waitingToSend。
    • 主方法:removeSocketService。取消绑定对应的SelectionKey。

    SocketIO

    • 对SocketChannel的封装。
    • 用一个LinkedBlockingQueue来保存要发送的数据dataToSend。
    • 做了真正的流量统计。

    ConnectionOpenThread

    • 这个类启动了accept的端口等待接入。
    • 接入后生成一个IOService,其中保存了socketChannel信息。
    • 传递IOService到可以waiting队列后,取出其中的socketChannel绑定事件,即可收发。

    想快点找到作者也可以到Twitter上留言: @54chen
    或者你懒得带梯子上墙,请到新浪微博:@54chen


沪ICP备19023445号-2号
友情链接