关闭

多Reactor

151人阅读 评论(0) 收藏 举报
分类:

       这两天发现了一个bug,一个nio的server,多Reactor , 设置的非阻塞模式, 当前channel可写时,代码 直接一句 channel.write( wBuf );  将当前连接上处理好的响应包一个一个写出去.   因为这个写是非阻塞的, channel.write的时候 如果当前内核socket缓冲区的空间比当前这个输出buffer要小 ,这个方法会也会马上返回,但是实际上数据没写完.(如果是阻塞模式的,就会等待直到这个包全部被写到socket缓冲区).

     修改了下代码,包没写完,再次注册read事件 .下次再写. 

     int bytesWritten = ((SocketChannel)channel).write( wBuf );

    // Socket buffer is full.

       if (wBuf.remaining() > 0) 
{
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE) ; 
key.selector().wakeup();
break;
}


     顺便介绍下这个多Reactor  

     每个Reactor   ,一个select线程, 负责数据的读和写,读到数据后交由一个workThread做业务,再将response包写入当前session的buffer, select主线程负责write到channel.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4276次
    • 积分:54
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    最新评论