我得到一个非常奇怪的NIO行为,在非常罕见的情况下,当我调用select()时,我没有在断开连接时选择readyKey(由于VM kill):
while (selector.isOpen()){
selector.select(SELECT_TIMEOUT);
Set<SelectionKey> readyKeys = selector.selectedKeys();
if(!readyKeys.isEmpty()){
System.out.println("Selected...");
}
}
密钥注册如下:
key.interestOps(SelectionKey.OP_READ);
操作系统:CentOS 6.2
VM:XEN
Java:JDK_1.6u17
Keep_ALIVE设置为每1秒运行
答案 0 :(得分:2)
如果连接由于keepalive故障而终止,则会重置,而不是正常关闭,因此不会传递FIN,因此没有“可读”事件。在这种情况下,发现断开连接的唯一方法是在写入时通过IOException,或者通过读取事件的缺席,即基本上是读取超时。
不要将keepalive设置为每秒运行一次。这非常浪费。