我有经典的http客户端/服务器应用程序,服务器在服务器端按照自己的意愿提供客户端数据,但是也对客户端地址列表执行某种回调。我的两个问题是:服务器如何检查客户端的可用性?
1-服务器如何知道客户端是否关闭(客户端没有断开,但连接突然中断)?
2-有没有办法从服务器端知道客户端在回调端口上侦听的进程是否仍然运行(即客户端回调套接字仍然打开)?
我有经典的http客户端/服务器应用程序,服务器在服务器端按照自己的意愿提供客户端数据,但是也对客户端地址列表执行某种回调。我的两个问题是:服务器如何检查客户端的可用性?
1-服务器如何知道客户端是否关闭(客户端没有断开,但连接突然中断)?
2-有没有办法从服务器端知道客户端在回调端口上侦听的进程是否仍然运行(即客户端回调套接字仍然打开)?
1-服务器如何知道客户端是否关闭(客户端没有断开,但连接突然中断)?
选项#1:直接通信
客户端告诉服务器 “我还活着” 在周期性间隔。您可以让您的客户端以可配置的时间间隔服务于您的服务器,并且如果服务器在某段时间内未收到信号,则会将客户端标记为关闭。客户甚至可以在每个心跳中告诉服务器更多的信息(例如状态),这也是许多分布式系统(例如Hadoop/Hbase)中使用的方式。
选项#2:分布式协调服务
你可以把连接到一台服务器作为一组所有客户端,并且使用第三方分布式协调服务像动物园管理员以方便会员管理。客户在启动后立即注册为Zookeeper作为该组的新成员,并在组停止后离开组。 Zookeeper每当成员资格发生变化时都会通知服务器。
2 - 有没有办法从服务器端知道,如果在客户端监听回拨端口的进程仍上涨(即客户端回调插座仍处于打开状态) ?
Option #1
来完成。这可能是客户端以固定的时间间隔告诉服务器“我的回调端口正常”的方式,或者服务器询问客户端“您的回调端口是否正常?”并等待其在一个固定的时间间隔非常感谢您的澄清。 –
@ User_X220不客气:-) – shizhz
你将不得不建立某种协议;并简单地说:服务器跟踪它试图发送给客户端的“消息”。
如果该“发送”被确认,罚款;如果不是,那么服务器可能会执行有限次数的重试;然后将该客户视为“不在”;然后删除该客户端的任何其他消息。
谢谢你的回答。 –
非常欢迎。在我的简要总结上你有一些很好的答案:-) – GhostCat
1-服务器如何知道客户是向下响应(客户端没有断开,但得到的连接突然中断)?
写入客户端将失败。
2 - 有没有办法从服务器端知道,如果在客户端监听回拨端口的进程仍上涨(即客户端回调插座仍处于打开状态
到客户端的写操作将失败。
写不一定会立即失败,由于TCP缓冲,但写入最终会引发重试和重试超时,这将导致随后的读取或写入失败。
在Java中失败将表现为IOException: connection reset
。
谢谢您的回复。 –
与websockets双方可以相互ping/pong,而不需要客户端到服务器 –
@亨宁路德:谢谢 –