【问题标题】:How could a server check the availability of a client?服务器如何检查客户端的可用性?
【发布时间】:2017-07-25 05:13:18
【问题描述】:

我有经典的 http 客户端/服务器应用程序,服务器可以随意为客户端数据提供服务,但也会对其拥有的客户端地址列表执行某种回调。我的两个问题是:

1- 服务器如何知道客户端是否宕机(客户端没有断开但连接突然中断)?

2- 有没有办法从服务器端知道在客户端侦听回调端口的进程是否仍在运行(即客户端回调套接字仍然打开)?

【问题讨论】:

  • 使用 websockets 双方可以互相 ping/pong,而不仅仅是客户端到服务器
  • @HenningLuther:谢谢

标签: java sockets http tcp callback


【解决方案1】:

您必须建立某种协议;简单地说:服务器会跟踪它试图发送给客户端的“消息”。

如果“发送”被确认,没问题;如果不是:那么服务器可能会进行有限次数的重试;然后将该客户视为“走了”;然后删除该客户端的任何其他消息。

【讨论】:

  • 不客气。除了我的简短摘要,您还得到了一些不错的答案:-)
【解决方案2】:

1- 服务器如何知道客户端是否宕机(客户端没有断开但连接突然中断)?

  • 选项#1:直接沟通

    客户端定期告诉服务器“我还活着”。您可以让您的客户端以可配置的时间间隔连接到您的服务器ping,如果服务器在一段时间内没有收到信号,它会将客户端标记为关闭。如有必要,客户端甚至可以在每个心跳中告诉服务器更多信息(例如它的状态),这也是许多分布式系统(例如 Hadoop/Hbase)中使用的方式。

  • 选项 #2:分布式协调服务

    您可以将连接到服务器的所有客户端视为一个组,并使用像 Zookeeper 这样的第三方分布式协调服务来促进成员管理。客户端在启动后立即将自己注册到 Zookeeper 作为组的新成员,如果组关闭则离开组。 Zookeeper 会在成员更改时通知服务器。

2- 有没有办法从服务器端知道在客户端侦听回调端口的进程是否仍在运行(即客户端回调套接字仍然打开)?

  • 我认为这只能通过上面列出的Option #1 的方式来完成。这可能是客户端以固定间隔告诉服务器“我的回调端口正常”的方式,或者服务器询问客户端“你的回调端口是否正常?”的方式。并以固定的时间间隔等待它的响应

【讨论】:

    【解决方案3】:

    1- 服务器如何知道客户端是否宕机(客户端没有断开但连接突然中断)?

    写入客户端将失败。

    2- 有没有办法从服务器端知道客户端侦听回调端口的进程是否仍在运行(即客户端回调套接字仍然打开

    写入客户端将失败。

    由于 TCP 缓冲,写入不一定会立即失败,但写入最终会引发重试和重试超时,从而导致后续读取或写入失败。

    在 Java 中,失败将表现为 IOException: connection reset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      • 2019-12-05
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多