重试在套接字级别上读取客户请求

时间:2017-07-21 02:55:08

标签: java sockets networking netty selector

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

  SelectionKey next = it.next();

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

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

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

1 个答案:

答案 0 :(得分:1)

  

我正在研究一种传输机制,如果内部队列已经满了,我应该忽略套接字上的OP_READ事件。

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

效果将阻止受影响的同伴发送。

  

如何重试阅读请求?

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

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