读书人

请问服务器对客户端回应的思路

发布时间: 2012-09-13 09:51:52 作者: rapoo

请教服务器对客户端回应的思路

请教一个 服务器回应客户端的问题.

服务器收到心跳包后,是否应该 发送一个回应给客户端。


服务器的心跳包线程里,收到了心跳包,那么就立即构造一个回应包,然后send 回应给客户端。


但是我的程序服务器还有一个功能:会主动推送在线用户列表给客户端。(每隔几秒就主动推送一次)


目前有3个方案做回应:
1. 客户端发送消息给服务器,服务器回应,客户端接受,然后更新最后的通信时间
2. 客户端发送心跳包,服务器回应,客户端接受,然后更新最后的通信时间
3. 不要发送任何回应的数据包给客户端,因为服务器主动推送在线用户列表,那么 客户端 收到后,则更新服务器的最后通信时间。

大家说,是否需要增加一个 “回应包”,我感觉不需要额, 可以采用方案3.




回应功能是今天想添加的,那些代码以前就写好了,运行了好些日子了。

今天一个群里有人指出,
未加回应之前,每隔几秒钟发送 在线用户表 可以修改为:服务器定义2个在线用户表。

old, current

old记录上一次的在线用户表, current记录当前的。

推送 在线用户表的 那个线程功能改为(只需要增加几句代码)

if(old!=new)
{
//开始推送
}
Sleetp(几秒钟);





2个问题:

问题1:他说的是否正确?
问题2:如果他说的正确,那么意味着3种方案 必须去掉第3钟了。

只剩下2种方案,请问我该采用哪一种?

我有2个问题,请都回答,谢谢。 因为第2个问题,跟第一个问题有关系。



[解决办法]
如果有cs之间定时通讯,看lz你应用需要的心跳频率,如果已有的推送已经足够,可以重用,毕竟也能省下消息包!
[解决办法]
除非你带宽实在受限。
否则,每一层都最好有自己的握手和心跳包。
[解决办法]
应该综合3个方案处理心跳包:
1. 心跳包是客户端->服务器,以成功接收消息时间更新最后的通信时间
2. 单独使用一个线程监控心跳包发送,循环监控,如果最后通信时间超出心跳监控时间就给服务器发心跳包,如果发送成功就更新最后通信时间,如果网络有问题就会发送不成功,此时可以做出错处理
3. 服务器不需要发送任何回应的数据包给客户端,因为回送数据包对客户端没有任何意义,
4、服务器上维持每个在线用户的状态,最后通信时间,如果接收到心跳包也需要更新最后在通信时间,超出两个时间间隔以上没有正常通信(当前时间-最后通信时间)就判断此用户为不在线,把此用户做离线处理
5、服务器主动推送在线用户列表作为一个普通的消息包处理,不需要作任何特殊处理。另外一般不需要定时主动推送在线用户列表,一般是有用户上线离线时,即在线用户变化时向所有在线用户通知在线用户列表;或者就通知其他人当前正在上下线的用户也可以;没必要定时重复发送在线用户列表,这样浪费通信带宽还增加复杂度
以上我们项目中处理情况,希望能对你有所帮助
[解决办法]
一看脑子里就没有异步的概念.

读书人网 >C++

热点推荐