如何检查Socket目前是否以Java连接?

我试图找出Java TCP套接字当前是否连接,以下似乎只是告诉我套接字是否已在某些时候连接 – 而不是它当前是否仍然连接。

socket.isConnected(); 

任何帮助表示感谢,谢谢。

  • 一旦客户端连接(甚至在断开连接后), socket.isConnected()总是返回true!
  • socket.getInputStream().read()
    • 只要客户端连接,线程就等待输入,因此使你的程序不做任何事情 – 除非你得到一些输入
    • 如果客户端断开连接则returns -1
  • socket.getInetAddress().isReachable(int timeout) :from isReachable(int timeout)

    测试该地址是否可达。 尽管尝试到达主机,但是防火墙和服务器配置可以阻止导致无法访问状态的请求,同时可以访问某些特定端口。 如果可以获得特权,则典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接。

假设您对协议有一定程度的控制权,我非常喜欢发送心跳来validation连接是否处于活动状态。 它被certificate是最容易出错的方法,并且在连接断开时通常会给您最快的通知。

TCP keepalive可以工作,但如果远程主机突然断电怎么办? TCP可能需要很长时间才能超时。 另一方面,如果你的应用程序中有逻辑需要每隔x秒进行一次心跳回复,那么当你第一次没有得到它们时,你知道连接不再有效,无论是网络还是远程端的服务器问题。

请参阅我是否需要心跳以保持TCP连接打开? 进一步讨论。