2

我得到一个非常奇怪的 NIO 行为,在非常罕见的情况下,当我调用 select() 时,我没有在断开连接时选择 readyKey(由于 VM 杀死),如下所示:

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

虚拟机:XEN

Java:JDK_1.6u17

Keep_ALIVE 设置为每 1 秒运行一次

4

1 回答 1

2

如果连接因为keepalive失败而终止,它会被重置,不会正常关闭,所以没有FIN下发,所以没有'可读'事件。在这种情况下,发现断开连接的唯一方法是在写入时通过 IOException,或者通过没有读取事件,即本质上是读取超时。

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

于 2012-06-25T19:29:06.880 回答