我有经典的http客户端/服务器应用程序,其中服务器随意为客户端数据提供服务,但也会对其拥有的客户端地址列表执行某种回调。我的两个问题是:
1-服务器如何知道客户端是否已关闭(客户端没有断开但连接突然中断)?
2-有没有办法从服务器端知道客户端监听回叫端口的进程是否仍在运行(即客户端回叫套接字仍处于打开状态)?
答案 0 :(得分:1)
1-服务器如何知道客户端是否已关闭(客户端没有断开但连接突然中断)?
选项#1:直接沟通
客户端定期告诉服务器“我还活着”。您可以以可配置的间隔使客户端ping
服务器,如果服务器在特定时间内没有收到信号,则会将客户端标记为关闭。如果需要,客户端甚至可以在每个心跳中告诉服务器更多信息(例如,它的状态),这也是许多分布式系统中使用的方式(例如Hadoop / Hbase)。
选项#2:分布式协调服务
您可以将连接到服务器的所有客户端视为一个组,并使用第三方分布式协调服务(如 Zookeeper )来促进成员资格管理。客户端在启动后立即将自己注册为 Zookeeper 作为该组的新成员,并在该组停止时离开该组。每当成员资格发生变化时, Zookeeper 都会通知服务器。
2-有没有办法从服务器端知道客户端监听回叫端口的进程是否仍在运行(即客户端回叫套接字仍处于打开状态)?
Option #1
方式来完成。它可以是客户端以固定间隔告诉服务器“我的回调端口是否正常”的方式,或者服务器询问客户端“你的回调端口是否正常?”并以固定的间隔等待其响应答案 1 :(得分:0)
你必须建立某种协议;简单地说:服务器跟踪它试图发送给客户的“消息”。
如果确认“发送”,那很好;如果不是:那么服务器可能会进行有限次数的重试;然后把客户视为“消失”;然后删除该客户端的任何其他消息。
答案 2 :(得分:0)
1-服务器如何知道客户端是否已关闭(客户端没有断开但连接突然中断)?
写入客户端将失败。
2-有没有办法从服务器端知道客户端监听回叫端口的进程是否仍在运行(即客户端回叫套接字仍处于打开状态
写入客户端将失败。
由于TCP缓冲,写入不一定会立即失败,但写入最终会引发重试并重试超时,导致后续读取或写入失败。
在Java中,失败将表现为IOException: connection reset
。