如何使用java.net.Socket setKeepAlive(boolean b) API?
我正在使用一个简单的服务器托管Socket
。
客户端可以连接并发送数据。除非客户端发送流结束,否则我不会关闭连接。客户端可以继续保持连接任意时间。数据传输将继续,但突然我发现连接丢失,没有任何日志。一旦客户端(不是服务器)重新启动,传输就会再次开始。
我没有设置任何timeout
默认情况下它是无穷大。我想了解什么setKeepAlive
实际上这样做是为了让我能够决定是否需要将其设置为true
。
有人可以帮助我理解同样的事情吗?谢谢。
作为文档setKeepAlive()说,它将启用(或禁用)SO_KEEPALIVE插座上的选项。
当为 TCP 套接字设置 keepalive 选项并且 2 小时内没有通过套接字在任一方向上交换数据时(注意:实际值取决于实现),TCP 会自动向对等方发送 keepalive 探测。该探测是对等方必须响应的 TCP 段。预计会出现以下三种响应之一: 1. 对等方以预期的 ACK 进行响应。应用程序不会收到通知(因为一切正常)。 TCP 将在另外 2 小时不活动后发送另一个探测。 2. 对等方以 RST 进行响应,告知本地 TCP 对等方主机已崩溃并重新启动。套接字已关闭。 3. 对方没有回应。套接字已关闭。该选项的目的是检测对等主机是否崩溃。仅对 TCP 套接字有效:SocketImpl
Here是另一个参考解释SO_KEEPALIVE
option.
请注意,在网络中,连接可能随时由于多种原因而丢失。如果连接穿越 NAT 路由器,NAT 表中的条目可能会过期(当连接空闲时),并且连接因此丢失。客户端可能会停止运行或被暂停(尤其是笔记本电脑和移动设备),或者电缆可能会断开,或者 WiFi(或蜂窝)信号可能会受到干扰,或者……这样的例子不胜枚举。您的服务器需要编写为能够优雅地处理连接丢失的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)