【发布时间】:2010-11-26 06:38:50
【问题描述】:
我正在尝试找出 Java TCP 套接字是否当前已连接,以下内容似乎只是告诉我套接字是否在某个时候已连接 - 而不是它当前是否仍处于连接状态.
socket.isConnected();
任何帮助表示赞赏,谢谢。
【问题讨论】:
-
已回复here。
我正在尝试找出 Java TCP 套接字是否当前已连接,以下内容似乎只是告诉我套接字是否在某个时候已连接 - 而不是它当前是否仍处于连接状态.
socket.isConnected();
任何帮助表示赞赏,谢谢。
【问题讨论】:
socket.isConnected() 一旦客户端连接(甚至在断开连接之后)总是返回真奇怪!!socket.getInputStream().read()
returns -1 如果客户端断开连接socket.getInetAddress().isReachable(int timeout):来自isReachable(int timeout)
测试该地址是否可达。实现会尽最大努力尝试访问主机,但防火墙和服务器配置可能会阻止请求,从而导致无法访问状态,而某些特定端口可能可以访问。如果可以获取权限,典型的实现会使用 ICMP ECHO REQUEST,否则会尝试在目标主机的端口 7 (Echo) 上建立 TCP 连接。
【讨论】:
socket.getInetAddress().isReachable(int timeout) 忽略了套接字连接到的端口号。
假设您对协议有一定程度的控制,我非常喜欢发送心跳来验证连接是否处于活动状态。它已被证明是最防故障的方法,并且通常会在连接中断时给您最快的通知。
TCP keepalives 可以工作,但是如果远程主机突然断电怎么办? TCP 可能需要很长时间才能超时。另一方面,如果您的应用程序中的逻辑期望每 x 秒收到一次心跳回复,那么当您第一次没有收到它们时,您就知道连接不再有效,无论是由于网络还是远程服务器的问题.
更多讨论请见Do I need to heartbeat to keep a TCP connection open?。
【讨论】: