请教一个 服务器回应客户端的问题.服务器收到心跳包后,是否应该 发送一个回应给客户端。    
服务器的心跳包线程里,收到了心跳包,那么就立即构造一个回应包,然后send  回应给客户端。
但是我的程序服务器还有一个功能:会主动推送在线用户列表给客户端。(每隔几秒就主动推送一次)
目前有3个方案做回应:
1. 客户端发送消息给服务器,服务器回应,客户端接受,然后更新最后的通信时间
2. 客户端发送心跳包,服务器回应,客户端接受,然后更新最后的通信时间
3. 不要发送任何回应的数据包给客户端,因为服务器主动推送在线用户列表,那么 客户端 收到后,则更新服务器的最后通信时间。大家说,是否需要增加一个 “回应包”,我感觉不需要额, 可以采用方案3.回应功能是今天想添加的,那些代码以前就写好了,运行了好些日子了。今天一个群里有人指出, 
未加回应之前,每隔几秒钟发送 在线用户表 可以修改为:服务器定义2个在线用户表。old, currentold记录上一次的在线用户表, current记录当前的。推送 在线用户表的 那个线程功能改为(只需要增加几句代码)if(old!=new)
{
//开始推送
}
Sleetp(几秒钟);

2个问题:问题1:他说的是否正确?
问题2:如果他说的正确,那么意味着3种方案 必须去掉第3钟了。只剩下2种方案,请问我该采用哪一种?我有2个问题,请都回答,谢谢。 因为第2个问题,跟第一个问题有关系。

解决方案 »

  1.   

    恐怕是得加上心跳包,否则检测出异常可能会严重滞后(等到send失败)。由于你的服务端本来就有数据源源不断的发往客户端,所以你就把数据当成心跳包即可,即服务端推送数据,客户端回应(好像你的方案中没有这个)。心跳包会带来额外开销,检测到断线的实时性满足要求即可,不要追求过高的实时性。
    比如,客户端甚至可以每收到10个包才回一个,只要服务端的断线检测超时时间稍大于客户端10次数据回应的间隔即可,结果都一样(都能检测到断线),不同的只是在实时性上。客房端的断线检测当然就是看上次收到服务端推送数据的时间。
      

  2.   

    心跳包一般是用来检测是否还连接着。
    对于回应超时可以设置超时时间。我觉得你是不是错用心跳包了。
    我假想QQ:
    1,心跳包用来确认连接正常。一般是C发给S,S收到再发给C。心跳包比较频繁。
    2,推送列表。他说的比较简单,判断==或者!=不是那么简单。可以加入一个标记,列表修改后才推送。
    最后通信时间:用心跳包的比较准确。因为心跳包时间很短,频繁。相比之下,推送列表时间较长。
    希望对你有用。
      

  3.   


    非常抱歉,我 没有说 :
    客户端 会发送心跳包给服务器端。让服务端知道客户端的在线状态。我想问的是: 客户端当然也得知道 服务端的在线状态啊?(服务端还有个功能,不断的推送 在线列表)根据这2天的回帖:总结了一个题外话,对于 推送列表 ,可以改进,正如4楼的法子。
    但是对于主贴的 问题:如何回应客户端呢?个人以为:当收到心跳包就send一个回应给服务端。所谓的方案1中的 “消息”,指的是聊天内容,传送的文件。我主贴的疑问是: 是否 收到客户端的任何东西(心跳包, 聊天内容,传送的文件,等各种东西),都发送一次 回应给该客户端还是只对客户端的心跳包进行回应?