首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java NIO -正常关闭客户端上的连接

Java NIO -正常关闭客户端上的连接
EN

Stack Overflow用户
提问于 2014-07-04 20:23:39
回答 2查看 2K关注 0票数 0

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

代码语言:javascript
运行
复制
            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。在客户端,这是我用来关闭连接的方法:

代码语言:javascript
运行
复制
public void close() throws IOException {
    connection.close();
    connection.keyFor(selector).cancel();
    selector.close();
}

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

EN

回答 2

Stack Overflow用户

发布于 2014-07-04 21:11:54

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

一个更简单的解决方案是让客户端预料到这个异常并静默地处理它。但是,毒丸消息更可靠,因为您可以判断连接是否有意由服务器关闭。

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-04 22:50:28

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

解决方案:不要这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24574255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档