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

Sup*_*tux 25 java sockets tcp

我试图找出Java TCP套接字当前是否连接,以下似乎只是告诉我套接字是否已经连接 - 而不是它当前是否仍然连接.

socket.isConnected();
Run Code Online (Sandbox Code Playgroud)

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

Sum*_*ngh 20

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

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

  • 不正确.'checkError()告诉你使用套接字时是否有*previous*IOException.一旦客户端断开连接,它就会*变为"真实".-1 (7认同)
  • 您的第三点,`socket.getInetAddress().isReachable(int timeout)`,忽略了套接字连接到的端口号。 (2认同)

Jas*_*ols 16

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

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

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