两个账号同时登录,后登录的账号将前一个账号挤掉

最近有个小项目要求实现相同的账号不能同时登录,如果有两个账号(一样)登录,那么后登陆账号能挤掉前一个账号,像WebQQ那样被挤掉的账号还要有通知。当时首先想到的是有没有一种方法是这样的:一个客户端有一个账号在登录,首先判断该账号是不是已经登录,如果有通知服务器该客户端有同样的账号登录,然后再发消息给另外一个客户端,通知其账号被挤掉。如果没有则正常登录。但是这种方法我不太清楚。后来想到该原理与网站里面的即时消息机制是一模一样的。(可以以博客园为例,我们发一个短消息给另外一个用户,该用户可以马上收到信息,就是互相通话)

     在后来只知道一般这个消息机制是通过不断读取数据库中的数据,例如:

一张表式这样的(自己想的一个非常简单的)

MessageID

MessageFrom

MessageTO

MeesageContent

MessageRead

1

小明

小芳

“你好”

false

2

小芳

小明

“你好”

false

 

 

 

那么在客户端我们不断查询数据库

Select * from dt_message where MessageTo=’该用户’

那么我们可以得到该用户收到的信息了。

 

这样在这个基础上我想到建立如下图的表:

 2010042709284975.jpg

用户登录的时候我们就会改写该用户对应的UserIP字段,将其值设置为登录用户的客户端IP地址。然后客户端不断地(每隔1秒)向服务器提出请求要求得到UserIP字段,得到的UserIP字段与该客户端IP地址相比较,当不相等时,就代表该账号在别处登录。那么我们在作出相应的处理,帮该用户注销,并告知他该账号已在别处登录。

       当用户关闭所有窗口时,我们可以认为他注销其账号了,可以在global.asax里Application_End事件将数据库里UserIP字段清空(概念错误,这里我原先理解成了是对应的客户端应用程序,这里应该是服务器的最后一个应用程序所以不可能实施,谢谢园友们指点出来)。个人认为没有必要,除非是两个相同账号同一时间不能同时登录,不发生挤账号行为。那么这里才有必要添加,因为IP地址不为空就代表着账号还在登录中,另外一个账号不能登录。若有挤账号则不存在这个问题。

 

这只是我的想法,如果大家有更好的处理办法,希望给出来。若每个用户每秒向服务器请求一次,可以想想若用户同时在线达到几千会对服务器负载造成多大负担?WebQQ,博客园这样网站的消息机制实现是不是像我上面说的那样,如果是,有没有优化操作?希望园友们能给出自己理解答案。

 

程序环境:VS2008+SQL 2005

运行时将Database文件夹里数据库附加到数据库中去。

这里给出我这里实验的例子(注:该程序主要是验证我的猜想,并实挤账号的功能,其余的一切忽略。账号:hu 密码:123)

转载于:https://www.cnblogs.com/couhujia/archive/2010/04/27/1721756.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值