3

我写了一个小的服务器/客户端应用程序。这是代码

try 
{
   OutputStream os = clientSocket.getOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(os);   
   System.out.println("clientsocketstatus connected: " + clientSocket.isConnected());
   System.out.println("clientsocketstatus closed: " + clientSocket.isClosed());
   oos.writeObject(keepAliveNW); 
} 
   catch(Exception e) 
{ 
   e.printstacktrace(); 
}

现在,当我在 Windows 中禁用 NIC 并重新启用 netstat 时,显示我的 PC1 和 PC2 之间没有打开的连接。现在,当我的客户端尝试发送 keepAliveNW 对象时,应该有一个异常,但没有。我连线了。服务器上没有数据到达。我还在客户端上使用了 Wireshark。Keep-Alive 数据包已发送,但从来没有任何 TCP ACK 数据包,因此 Java 应该检测到出现问题。当连接完全建立时,在 keep-Alive Paket 之后会有一个 TCP ACK Paket。那么如何检测到连接已断开?

感谢帮助。

4

1 回答 1

-1

发送keep-alive段后,TCP将在没有收到确认后重新传输,并且在收到足够的确认后,将向调用应用程序报告错误。

可以通过发送仅触发 ACK 的 0 长度消息来确认非活动连接的继续存在。这类似于某些平台上可用的操作系统级保活功能,但可以调整到应用程序所需的频率。

于 2013-01-19T20:49:48.580 回答