Java NIO - 在客户端优雅地关闭连接

时间:2014-07-04 12:23:39

标签: java sockets nio

使用NIO时,我在服务器端进行了以下检查:

            if (key.isReadable()) {
                readBuffer.clear();
                SocketChannel channel = (SocketChannel) key.channel();
                int read = channel.read(readBuffer);
                if (read == -1) {
                    channel.close();
                    channel.keyFor(selector).cancel();
                } else {
                    readBuffer.flip();
                    System.out.println(charset.decode(readBuffer));
                }
            }

但是,通常情况下,read将抛出java.io.IOException: An existing connection was forcibly closed by the remote host。在客户端,这是我关闭连接的方法:

public void close() throws IOException {
    connection.close();
    connection.keyFor(selector).cancel();
    selector.close();
}

如果这不是优雅的方式,那是什么?

2 个答案:

答案 0 :(得分:0)

服务器应向客户端发送消息以关闭其连接。它只能在缓冲区未满时执行此操作,但它将允许客户端正常关闭连接。

更简单的解决方案是让客户端期望此异常并以静默方式处理它。但是,毒丸消息更可靠恕我直言,因为您可以判断连接是否打算由服务器关闭。

BTW客户端可以向服务器发送相同的消息。发送消息后,您可能希望等待另一端挂断,然后自行关闭连接(或超时)

答案 1 :(得分:0)

如果在对等方已关闭连接后写入连接,则会出现此异常。换句话说,应用程序协议错误。

解决方案:不要。