多Reactor

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

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

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

       if (wBuf.remaining() > 0 && bytesWritten == 0)    // Socket buffer is full.
{
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE) ; 
key.selector().wakeup();
break;
}

 

     顺便介绍下这个多Reactor  

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值