java.net.Socket TCP keep-alive 用法

LPD*_*LPD 3 java sockets

如何使用java.net.Socket setKeepAlive(boolean b)API?

我正在托管一个简单的服务器,使用Socket. 客户端可以连接并发送数据。除非客户端发送流结束,否则我不会关闭连接。客户端可以在任何时间段内继续保持连接。数据传输将继续进行,但突然我发现连接丢失,没有任何日志。一旦客户端(不是服务器)重新启动,传输将再次开始。我没有设置任何timeout,因为默认情况下它是无穷大。我想了解setKeepAlive实际执行的操作,以便我能够决定是否需要将其设置为true. 有人可以帮我理解相同的吗?谢谢。

dsh*_*dsh 7

正如文档所述setKeepAlive(),它将启用(或禁用)SO_KEEPALIVE套接字上的选项。

当为 TCP 套接字设置了 keepalive 选项并且 2 小时内没有在任一方向上通过套接字交换数据时(注意:实际值取决于实现),TCP 会自动向对等方发送一个 keepalive 探测。此探测是对等方必须响应的 TCP 段。预期三种响应之一: 1. 对等方以预期的 ACK 响应。不会通知应用程序(因为一切正常)。TCP 将在另外 2 小时不活动后发送另一个探测。2. 对端用 RST 响应,它告诉本地 TCP 对端主机已经崩溃并重新启动。插座已关闭。3. 对端无响应。插座已关闭。此选项的目的是检测对等主机是否崩溃。仅对 TCP 套接字有效:SocketImpl

是另一个解释该SO_KEEPALIVE选项的参考资料。


请注意,在网络中,由于各种原因,连接可能随时丢失。如果连接穿过 NAT 路由器,则 NAT 表中的条目可能会过期(当连接空闲时)并且连接因此而丢失。客户端可能会停止运行或被暂停(尤其是笔记本电脑和移动设备),或者电缆可能会断开连接,或者 WiFi(或蜂窝)信号可能会受到干扰,或者......列表可以继续。您的服务器需要编写为优雅地处理连接丢失。