QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 644|回复: 5

请教算法

[复制链接]
发表于 2003-7-14 22:14:27 | 显示全部楼层 |阅读模式
我写了一个聊天程序,数据库是access的,用UDP协议。

在数据库的表中,有一个字段bool isOnline表示用户是否在线。
用户登入的时候,isOnline = TRUE,登出的时候isOnline = FALSE。
如果用户出现特殊情况,死机,吊线之类的,没有logout就下了,如何使isOnline为TRUE。

我的想法是,每隔半分钟,查找数据库,isOnline == TRUE的,每找到一个,发送一个包给用户,如果在规定时间内没有得到回复,isOnline = FALSE。

不过,这么做是不是效率太低了?有没有更好的办法?
发表于 2003-7-14 23:17:27 | 显示全部楼层
多少分钟没说话就定为发呆状态,发呆多少分钟后就定为掉线。这个可以用定时事件触发。
回复

使用道具 举报

 楼主| 发表于 2003-7-15 14:08:34 | 显示全部楼层
哦,但是,这样用户多了会不会慢?...
MyICQ是怎么做的?我现在找不到他原来版本的源代码了,新的好象服务器不开源
哪里可以找到?共创里没有了
回复

使用道具 举报

发表于 2003-7-15 14:32:19 | 显示全部楼层
服务器端的主动查找不利于效率 实际上是否login是一个暂时数据 不要放到实际的数据库里 如果主机端停机了 是否login也都无所谓了
内存表里维护比较简单 每个人一个定时器也太消耗资源了
两张登陆表:1。working 每10分钟清0 再10分钟清除项目清除的项 转到2。idle表20分钟清0 再20分钟清除项目
用户端idle状态每分钟发一个connect包 设置working表
每次对话设置working表
回复

使用道具 举报

 楼主| 发表于 2003-7-15 19:46:13 | 显示全部楼层
谢谢,我明白了。
回复

使用道具 举报

发表于 2003-7-20 10:11:03 | 显示全部楼层
好像gaim的客户端隔几分钟就向服务器发一个get_user_list的包,服务器定时收不到就把用户标为下线.
有一次我在家里开了qq到同学家,他却看到我下线了.回到家一看,原来由于网络阻塞,"get_user_list是否重发的提示弹了几百个出来,好在linux稳定
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 11:42 , Processed in 0.043225 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表