2017-07-21 31 views
0

我正在处理传输机制,如果内部队列已满,我应该忽略套接字上的OP_READ事件。重试读取套接字级别上的客户请求

SelectionKey next = it.next(); 

    if (next.isReadable()) { 
     SocketChannel client = (SocketChannel) next.channel(); 

     if (!innerqueueIsFull()) { 
      if (client.read(nextRead) == -1) { 
       break; 
      } 
     } 
    } 

在为其中一个未决请求写入响应之后,我想返回并重试读取通道上的数据包。我如何重试读取请求?

回答

1

我正在处理传输机制,如果内部队列已满,我应该忽略套接字上的OP_READ事件。

正确的方法是在OP_READ中注销该通道的兴趣,或者如果只有一个内部队列,则注销所有通道。那么你甚至不会在频道上看到isReadable()事件。当队列清除时,重新注册OP_READ。

效果将会阻止受影响的对等体发送。

我该如何重试读取请求?

您不必以这种方式重试任何事情。只需以正常方式对isReadable()作出反应。事实上,你不必以任何方式重试,因为你从来没有读过,所以没有什么可以重试。

NB如果client.read()返回-1,则完全奇怪break。您应该关闭频道继续。没有理由不处理其他事件只是因为一个客户端已断开连接。

+0

谢谢。这听起来很完美。 (顺便说一句,我发布的代码段只是测试代码,当client.read()返回-1时我不会中断) – user1071840

相关问题