请描述一下你的聊天程序的建立方式。连接用tcp还是udp?点对点还是有服务器支持?
然后给你提供解决方案。
然后给你提供解决方案。
解决方案 »
- 使用remobjects,读取了一个视图,提交的修改数据,要更新一个表,如何做?
- 让ToolBar有这样的效果如何做?
- 请问如何得到treeview某个节点下的节点数
- 关于 DHtml的问题
- 怎么样使MEDIAPLAYER重复播放N次?
- 谁来救救我,一个动态菜单的奇怪问题。
- 重金酬谢:改写BaKuBaKu先生的easygrid控件
- 菜鸟问题:求救动态打开某某数据库文件的代码。如打开*.mdb,*.dbf,*.db.
- 如何重画DBGrid的单元格??
- 帖一个程序段(调不通),请高手指点
- 在线等待:如何获取鼠标的位置(X,Y)?
- 我知道怎样让一个FORM透明,可是怎么样让一个AxtiveXForm透明呢?
这个就好办了。
A,b,c为client,b中有A的好友。
先讨论以服务器为主的方式:
A 登陆--->服务器设置A的状态为logined...ok?
A 注销--->服务器设置A的状态为unlogined...ok?
好了,现在B登陆了,服务器 中如果保留了B的好友列表,那么就
给B发送好友列表状态。
哪么,A如果机器shutdown了呢?没有注销过程,服务器怎么知道
A的状态呢?这就需要A登陆后,服务器在固定的时间内要和A监测
心跳状态。这个说起来很高深的样子,实际上只要服务器定时向
已经登陆的client发送udp包,问询客户端:喂,你还活着吧?
然后客户端说:废话,我当然还活着。当服务器在多次询问某个客户
端没得到响应,哪么,服务器就把客户端设置成为unlogined,同时
看看这个客户A有没有好友,有的话就通知这些好友:你的朋友down啦,
因此状态就改变了。具体实现要看具体情况,但是基本是这个原理。
注意udp可以发送广播包的,可以不必每个A的好友都发送消息,只需要
统统发送一遍,由客户端自己决定需要不需要处理发来得广播包。
服务器中维持一个登陆状况列表。大概是下面这个样子:
userid
lastactivetime
其中客户端每隔一段时间,我们假定为5秒,给服务器发送一个请求
说:hi,I'm here.然后服务器只需要更新userid相关的lastactivetime
为当前时间就可以了。
如果客户端断线了,哪么就不会发送hi,i'm here请求了对不对?
哪么服务器需要一个thread,定期检查一下登陆客户列表,看看
各个lastactivetime是否比现在的时间差n秒,我们可以设置为
60秒,也就是说,如果客户端在1分钟之内都没给服务器发送存在请求
的话,哪么服务器就认为这个客户down掉了,因此把该客户从客户
列表中去掉。
上面讲的是存在状态检测。
如果按上面这个思路去做,哪么检测好友的状态也好办乐。
客户B,每n秒,比如10秒给服务器发送请求,送上所有好友id
让服务器判断以下好友是否在线就可以了。
是否回答清楚了你的问题?