【问题标题】:How do I check if a Socket is currently connected in Java? [duplicate]如何检查当前是否在 Java 中连接了 Socket? [复制]
【发布时间】:2010-11-26 06:38:50
【问题描述】:

我正在尝试找出 Java TCP 套接字是否当前已连接,以下内容似乎只是告诉我套接字是否在某个时候已连接 - 而不是它当前是否仍处于连接状态.

socket.isConnected();

任何帮助表示赞赏,谢谢。

【问题讨论】:

标签: java sockets tcp


【解决方案1】:
  • socket.isConnected() 一旦客户端连接(甚至在断开连接之后)总是返回真奇怪!!
  • socket.getInputStream().read()
    • 只要客户端已连接,线程就会等待输入,因此您的程序不会执行任何操作 - 除非您收到一些输入
    • returns -1 如果客户端断开连接
  • socket.getInetAddress().isReachable(int timeout):来自isReachable(int timeout)

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

【讨论】:

  • “out.checkError()”中有什么内容?你是说 System.out 吗?我认为这行不通。
  • 不正确。 'checkError() 告诉你在使用套接字时是否有prior IOException。它确实 not 在“客户端断开连接”后立即变为 true。 -1
  • 您的第三点socket.getInetAddress().isReachable(int timeout) 忽略了套接字连接到的端口号。
  • 如果我的线程在 socket.getInputStream().read() 中等待并且我的客户端断开连接会发生什么?我试图拔出以太网电缆,线程在那里等待!
  • 第三个选项 -> socket.getInetAddress().isReachable(int timeout) 对我来说非常有用。谢谢苏米特辛格
【解决方案2】:

假设您对协议有一定程度的控制,我非常喜欢发送心跳来验证连接是否处于活动状态。它已被证明是最防故障的方法,并且通常会在连接中断时给您最快的通知。

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

更多讨论请见Do I need to heartbeat to keep a TCP connection open?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多