服务器如何判断客户端是否在线!(有这方面实际经验的进来谈谈) (300分)

  • 主题发起人 主题发起人 子陵
  • 开始时间 开始时间

子陵

Unregistered / Unconfirmed
GUEST, unregistred user!
在编程中,如果Client端的计算机突然掉电或重新启动,Server端的程序怎样才能捕捉
到这一事件的发生
这样的问题网上也很多,结果都是说服务器或客户端定时向对方循环发送包,如果对方没有回应
或是超时就表示断线了.
但我想知道这个具体过程室怎样的?
比如QQ,同时在线的用户有几十万.要维护用户的在线信息,那么如果采用上面所说的循环发包的
方式来检查,在性能和时间上是不是可行.如过QQ不是这样做到,那他是怎么处理的,还有MSN和
ICQ等是如何处理的.
还有什么方法可以处理这个问题.
我设想的一个方案是在服务器端维护一个在线列表,
1)服务器每隔一段时间,就对每个在线列表中状态为true的用户发送一个询问包,
同时把在线用户的状态改为sleep.
2)当客户端受到询问包后,就发送回应包,
3)当服务器端受到回应包后,就将客户的状态置为True.
4)继续循环1,同时把状态还为sleep的用户的状态设为false(下线),并给他的好友发通知.
大家认为这个方案如何,有什么缺陷,欢迎批评!
分不够再加!
 
1.几十万用户并不是连在一台服务器上
微软msn至少有100台服务器
2.qq的再线信息并不是都发给服务器,而是也发给你的好友也就是别的
qq客户端。
3.假如是irc那种c/s模式,因为连接协议是TCP而不是UDP,所以连接断开
server随时都知道,这是tcp协议的一部分。

 
定时发送信息包。
C/S模式, 如果是SQL Server,就运行SP_who2存储过程就可以了.
 
有一个明显缺陷,
你采用一次信息决定客户端是否在线,如果客户端的回应包发生丢包,那就麻烦了。
xusong168的2,3很让人怀疑他的编程经验,tcp协议的server也并非随时都知道客户端的连接状况。如果是tcq协议,肯定是先让服务器端知道客户掉线的,如果服务器端知道了,客户想知道就很简单了。至于让客户端知道其他客户掉线是另外一件事情了。
 
“假如是irc那种c/s模式,因为连接协议是TCP而不是UDP,所以连接断开
server随时都知道,这是tcp协议的一部分。”
》》TCP协议只负责建立连接和保证数据的发送,断开应该不会得到通知的吧
“定时发送信息包。
C/S模式, 如果是SQL Server,就运行SP_who2存储过程就可以了”
》》我说的是网络通信,不是SQL Server
 
我以前做过这么一个东东,和你的方法有点类似,不过我的服务器
只是检索在线用户列表,不向客户端发数据。
客户端连接时在服务器的在线用户列表中注册,并设置用户状态为2
客户端定时连接服务器并将其状态恢复为2,服务器定时扫描在线用户列表
如果用户状态为0则说明用户不在线,否则对其状态进行减1操作,这样如果
客户端连续三次没有连接服务器则说明其不在线(次数与用户初始状态有关)。

 
》jiajiajia888
谢谢,一个状态是有问题,但《迷糊》的回答解决的这个问题
看来这个方案是可行的,而且<迷糊》也实现过
现在的我想了解的是
1。如果用户数量比较多,这样短时间,大批量的循环查询、发送信息和更新数据,在性能和实时性上是否可以接受(我没这方面的经验)
2。QQ,MSN等其他即时消息软件是怎么实现的。
 
让Client主动给你发数据包,如果一段时间没有收到数据包就判断对方掉线
 
刚才又看了《迷糊》的回帖,发现他的方法是最好的。
首先服务器端维护一个在线人员列表,记录在线的人员和状态。
当客户端登录服务器后,先在在线列表中注册,再修改他的状态为2。
客户端定时连接服务器并将其状态恢复为2
服务器端定时扫描在线用户列表,如果用户的状态为0表示下线,否则对其状态进行减1操作,这样如果客户端连续三次没有连接服务器则说明其不在线
(次数与用户初始状态有关)。
现在主要是性能上的考虑
如果用户数量比较多,这样短时间,大批量的循环查询、发送信息和更新数据,在性能和实时性上是否可以接受(我没这方面的经验)
还有用户在线列表如何维护,用数据库表维护还是自己实现,隔多长时间扫描和发包才比较
合适,希望有工程经验的分析一下。(经验真的很重要啊!!!)
 
在线用户列表我用的是list维护,比数据库表快也方便
我的客户端不是很多,所以。。。呵呵,还是听听大伙怎么说。
 
我做过从类的项目,用的方法就是《迷糊》,不过是继承了一个ThreadList对象,因为
LIST对象不是线程安全的。
 
我做过从类的项目,用的方法就是《迷糊》,最高有过7千多人在线。不过我是继承了一个ThreadList对象,因为LIST对象不是线程安全的。
 
其实,我用的方法也和迷糊一样,
最高300人在线,
如果一台高性能的服务器能够支持7k人,那么几十万人就很容易实现了。
 
在维护在线用户上,我发现了一个问题,不知道各位发现没有
我使用的是 Indy 的一对 IdUDPServer 进行通信,服务器对所有在线用户循环传送语音数据
因为不知道如何检测客户机掉线,以至于现在的情况是
当在线用户存在某一无效的IP地址(即此IP没有运行客户端,可能是由于掉线引起,退出信号没有发送到服务器)
此时,服务器的 IdUDPServer 就再也不收接和发送数据了,以后的用户就无法连上服务器了
各位有何高见,请帮忙
 
好像我参与的一个项目是类似SP与运营商短信中心相连的,服务器也要求我们隔一定时间发一个命令给它以证明在线,很象张无忌说的。
 
多人接受答案了。
 
后退
顶部