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

时间:2009-09-07 16:08:45

标签: java sockets tcp

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

socket.isConnected();

感谢任何帮助,谢谢。

2 个答案:

答案 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?