我有一个自定义NIO服务器,但我看到一个我无法重现或解释的行为:选择器使用isReadable() == true
保持触发某个选择键但是当我从频道读取时,没有数据
我有:
iterator.next()
之后的所有内容的finally块中的所选键集的迭代器中删除,因此它不应该是ghost键一切都变空了,我在客户端尝试的每一个奇怪的事情都由服务器正确处理,但是大约每四个小时(你几乎可以设置一个时钟),来自俄罗斯的IP连接到服务器并触发这个错误。
此时选择器进入过驱动状态,不断触发通道和附加到它的读取过程,从而保持报告0字节的传入。
所以有两个问题:
更新:
如果我知道问题出在哪里,我可以提供该部分的一些代码,但整个服务器太大而无法粘贴在这里。
更新2
在我添加的调试内容中,我打印出以下状态:
selectionKey.isReadable() + "/" + selectionKey.isValid() + "/" + selectionKey.channel().isOpen()
所有三个布尔都是真的。
答案 0 :(得分:1)
没有一些代码就无法正确回答这个问题,但是:
除了实际数据和EOS之外,还有什么可以触发选择器上的读操作?
如果是ServerSocketChannel
,则为传入连接。
如果我找不到实际的问题,可以直接检查x数量的后续读取触发器,但没有数据,并得出结论我应该关闭套接字吗?
没有。在代码中找到错误。
有读取超时
非阻塞套接字上无法读取超时,并且当您使用Selector
时,必须使用非阻塞套接字。
但是由于bug的CPU密集性,它们太长了以至于我不舒服
我不知道这意味着什么。