在NIO连接断开时没有准备好关键

时间:2012-06-25 16:10:59

标签: java networking nio

我得到一个非常奇怪的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秒运行

1 个答案:

答案 0 :(得分:2)

如果连接由于keepalive故障而终止,则会重置,而不是正常关闭,因此不会传递FIN,因此没有“可读”事件。在这种情况下,发现断开连接的唯一方法是在写入时通过IOException,或者通过读取事件的缺席,即基本上是读取超时。

不要将keepalive设置为每秒运行一次。这非常浪费。