网络 心跳

来源:互联网 发布:制作吉他谱的软件 编辑:程序博客网 时间:2024/04/29 14:00

转载自:http://blog.csdn.net/henry000/article/details/7250866

网路断开掉线异常处理:   HeartBeat 网络心跳包

     一下是个人理解,网络心跳包的处理方式有两种“

           方式一:  终端主动发起,  服务器记录各个终端最后一个包的时间点,然后定时扫描全部客户端,如果扫描时间点与上次收包时间点相隔时间大于超时时间,则超时事件发生。服务器清除客户端信息记录。

          方式二: 服务器主动发起, 服务器定时发送心跳包,通过记录客户端连续多少次未有回应,则认为超时事件发生。如果多次没有收到回应但在一定范围内又收到回应,则清除记录。如果连续未收到回应达到一定量,则默认网络异常发生。

摘抄自:http://bbs.csdn.net/topics/380083798

问题:

我现在要开发一个服务器,客户端是用过TCP连接到服务端,要采用客户端向服务端发心跳包告诉服务端客户端在线,还是服务端发心跳包给客户端检测客户端是否在线?这两种方案的优缺点是什么?

然后还有一些数据采集器,就是嵌入式硬件,里面也是自己开发了一些程序,通过向服务器发送注册请求告诉服务器该采集器要上线了,是采用UDP跟服务器端通信,这种连接方式是采集器主动向服务端发动心跳告诉服务端此采集器在线,还是客户端发送心跳包检测采集器是否在线?这两种方案的优缺点是什么?

采集器信息是通过一些配置工具已存储在数据库中,不存在有未知的采集器向服务器注册的情况,也就是说数据库中没有该采集器的信息的话,是无法向数据库注册的。若数据库中存储的一些采集器没有对应的真实采集器向服务端注册,则该采集器的状态为离线状态

服务器采用C/C++开发的。

客户端是C#开发。

采集器内的程序是嵌入式的linux,跑的是C开发的程序


答复:

1.谁检测就谁发心跳包,你这里是服务器要检测客户端是否掉线,这样,服务器端拥有客户端的ip和port,然后给这些客户端发心跳包,然后统计回复的情况。
这个很直接的生活例子就是,服务器定时的向客户端喊话->喂,客户端你还在吗,客户端回复->我还在。
如果反过来,客户端发送心跳包的话,也是可以的,只是,逻辑上变成了客户端定时告诉服务器,我还在,而服务器没有主动权,没有操作权,只是被动的统计,这个时候,如何判断客户端是否离线也凌乱,是按照客户端的心跳频率来轮询呢,还是按照服务器端自己设置个相同的频率轮询客户端


2.如果采用服务器主动轮询客户端和采集器的话,必定得开专门的线程隔一段时间发送心跳请求包,由于所有客户端的心跳包包都是由同一个线程基本由同一时间发出,时间差很小,但是由于客户端的登入时间不确定,有些客户端还没到时间间隔服务端就给他发心跳请求包了,而且瞬间流量应该会很大。底端采集器同理。而且一个服务端大约要支持1000个采集器左右。另外应该还得要一个线程不断轮询各个客户端和采集器的时间戳,超时的话就判断离线了。

如果采用客户端和采集器主动发送心跳策略,服务端的流量应该会比较平稳,而且不会造成瞬时网络压力太大,服务端也只需要分别为客户端和采集器设计一个时间戳轮询检测线程来检测是否超时离线。

这个只是本人的看法,,大家有宝贵意见欢迎提出!!


3.采用web服务器的方式也许比较合适.

不过楼主说明一下是否做好了并发UDP服务器,还是只有一个UDP端口提供服务.

其实方法是比较简单的,event-loop里读UDP请求的时候记录下当前时间作为该client的last_time,用select来监听UDP端口,在每次进入select之前遍历所有client,计算它们各自的last_time与cur_time时间差大于保活时间就认为采集器掉线。


4.建议啊:
心跳驱动应该在客户端,也就是客户端决定要不要发,发什么,发得频率是多少。

服务器端应该是反射程序,客户端发什么,就原样返回过去,这样子达到心跳检测的目的,同时简化服务器端逻辑。


0 0
原创粉丝点击