我正在试图找出Java TCP套接字是否当前已连接,以下似乎只是告诉我套接字是否已在某个时刻连接 - 而不是它当前是否仍然连接
socket.isConnected();
感谢任何帮助,谢谢。
答案 0 :(得分:19)
socket.isConnected()
一旦客户端连接(甚至断开连接后)就会返回true,这很奇怪!! socket.getInputStream().read()
returns -1
socket.getInetAddress().isReachable(int timeout)
:来自isReachable(int timeout)
测试该地址是否可达。尝试尽力到达主机,但防火墙和服务器配置可以阻止导致无法访问状态的请求,同时可以访问某些特定端口。如果可以获得特权,典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接。
答案 1 :(得分:16)
假设您对协议有一定程度的控制权,我非常喜欢发送心跳以验证连接是否处于活动状态。它被证明是最容易出错的方法,并且在连接断开时通常会给您最快的通知。
TCP keepalive可以正常工作,但如果远程主机突然断电怎么办? TCP可能需要很长时间才能超时。另一方面,如果您的应用中有逻辑需要每隔x秒进行一次心跳回复,那么当您第一次没有得到它们时,您就会知道连接不再有效,无论是通过远程端的网络还是服务器问题
有关详细讨论,请参阅Do I need to heartbeat to keep a TCP connection open?。