gpt4 book ai didi

Java SocketChannel 没有检测到断开连接?

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:30 27 4
gpt4 key购买 nike

我有一个正在运行的套接字,使用选择器。我正在尝试检查我的套接字是否已连接到服务器。

Boolean connected = _channel.isConnected();

它总是返回真。我关闭了计算机上的机场(互联网连接),当我检查套接字是否已连接时,它仍然返回 true。知道为什么吗?我尝试每 3 秒向服务器写入一次数据,但它仍然没有将我的套接字状态更改为断开连接。

最佳答案

通常如果您关闭操作系统级别的网络,写入套接字应该会抛出异常,因此您知道连接已断开。

但更一般地说,我们无法确定数据包是否已送达。在 Java 中(也可能是 C),无法检查数据包是否已确认。

即使我们可以检查 TCP ACK,也不能保证服务器收到处理了数据包。它仅表示目标机器接收到数据包并将其缓冲在内存中。之后很多事情都会出错。

所以如果你真的想确定,你不能依赖传输协议(protocol)。您必须具有应用程序级别的ACK,即服务器应用程序在收到来自客户端的消息后写回ACK消息。

从客户端的角度来看,它向服务器写入一条消息,然后尝试从服务器读取 ACK。如果它收到它,则可以确定它的消息已被接收 处理。如果它没有得到 ACK,那么,它不知道发生了什么。根据经验,很可能 TCP 失败了。下一个可能性是服务器崩溃了。也有可能一切正常,只是 ACK 无法到达客户端。

关于Java SocketChannel 没有检测到断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com