我正在研究传输机制,如果内部队列已满,我应该忽略套接字上的OP_READ事件。
SelectionKey next = it.next();
if (next.isReadable()) {
SocketChannel client = (SocketChannel) next.channel();
if (!innerqueueIsFull()) {
if (client.read(nextRead) == -1) {
break;
}
}
}
在为其中一个待处理请求写入响应后,我想返回并重试读取通道上的数据包。我该如何重试阅读请求?
答案 0 :(得分:1)
我正在研究一种传输机制,如果内部队列已经满了,我应该忽略套接字上的OP_READ事件。
正确的方法是取消注册该频道OP_READ的兴趣,或者如果只有一个内部队列则注册所有频道。那么你甚至不会在频道上获得isReadable()
个事件。队列清除后,重新注册OP_READ。
效果将阻止受影响的同伴发送。
如何重试阅读请求?
您不必以这种方式重试任何内容。只是以正常方式对isReadable()
做出反应。事实上,你不必以你的方式重试任何东西,因为你从来没有读过,所以没有什么可以重试。
注意如果client.read()
返回-1,那么break
就完全奇怪了。您应该关闭频道并继续。没有理由不因为一个客户端断开连接而不处理其他事件。