多Reactor

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jeanter/article/details/51538209

       这两天发现了一个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.

猜你喜欢

转载自blog.csdn.net/jeanter/article/details/51538209