同一账号不能在异地登录,怎么做的?

sr35456 2015-09-28 10:51:52
加精
有一个WPF桌面应用程序,想要同一账号不能在两个地方同时登录,如果第二个客户端登录了,第一个客户端就退出。就像QQ一样。
这个功能是怎么做的?思路是怎样的?
...全文
11067 119 打赏 收藏 转发到动态 举报
写回复
用AI写文章
119 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2017-09-19
  • 打赏
  • 举报
回复
打错了,是 SSO
ilikeff8 2017-09-19
  • 打赏
  • 举报
回复
搜索SEO 单点登录
夜_麒麟 2015-10-19
  • 打赏
  • 举报
回复
引用 18 楼 sp1234 的回复:
对于真实技术的互联网软件,如果要通知对方做一件事儿,直接通知过去就行了。而没有事儿时,也不会随便打搅对方。 你想象一下,如果上千万的手机终端为了“自己是否在线”这一个简单的目的就去数据库里查询一下,那么他们多长时间查询一次合适和?5秒钟?5分钟? 真实情况下,数据库早坍塌了。多投资1000倍现金,也撑不住这种程序对数据库的滥用。
是不是可以吧是否登录信息放在内存中,登录时候首先客户端校验, 校验通过后去数据库改登录状态 ?
liurenbo1999 2015-10-17
  • 打赏
  • 举报
回复
这个可以有.继续
wangshijie2019 2015-10-14
  • 打赏
  • 举报
回复
lz解决了吗终极大招是什么
sr35456 2015-10-14
  • 打赏
  • 举报
回复
原以为WCF双工通信能实现这个功能,这几天一直在恶补WCF双工。补完之后,才发现,客户端在使用完之后就断开了连接,还是不能实现我的要求
csbinchina 2015-10-10
  • 打赏
  • 举报
回复
socket就可以搞定了。定义好所需要的通信协议,你的这些功能都能实现。
引用 37 楼 sr35456 的回复:
[quote=引用 25 楼 csbinchina 的回复:] 1 首先你的服务器端应该有一个客户端的连接对象列表; 2 客户端连接对象至少应该有客户端的用户名或者ID等标识,如果要做超时,还已经记录上次通信时间标签等; 3 当有一个客户端登录时,就去客户端连接对象列表中遍历,有相同用户名的,就将其连接断开,并从客户端连接对象列表删除,没有就直接重建新连接,并加入客户端连接对象列表。
看了楼上大佬们的回答,基本上知道了有两种思路: 1、是在服务器程序中断开客户端连接; 2、是客户端定时器不断访问数据库,如果登陆标识变化,则自动退出。 我只会做第2种,我想如果是第1种方法的话,效率可能会高些。那主动将客户端连接断开,这是哪方面的知识啊?服务端程序怎么就把某个客户端断开连接了呢[/quote]
  • 打赏
  • 举报
回复
从开发技术的管理角度看,其实“WCF 双工”这类技术是不太值得考虑的。你应该使用更加通俗、常用、必用的双向通讯方式。 对于基于b/s的系统,就可以使用 websock 方式来实现长连接。人家已经实现了心跳机制,用不着你自己开发。一旦客户端断开,立刻就能在服务器端抛出 closed 或者 error 事件,你就能将客户端的会话信息删除掉。 而对于其它类型的系统,你可以使用基于 TcpListener/TcpClient 的长连接方式。心跳是由服务器发出的,例如发一个“Ping”,那么客户端就必须在500毫秒内赶紧回一个“Pong”。如果超过1秒没有收到,那么服务器就判断客户端已经下线了。 心跳跟“踢掉登录”消息是完全不同的概念。当服务器要踢掉某个会话连接,直接发给它一个业务消息就行了。因此不要混淆。
  • 打赏
  • 举报
回复
从开发技术的管理角度看,其实“WCF 双工”这类技术是不太值得考虑的。你应该使用更加通俗、常用、必用的双向通讯方式。 对于基于b/s的系统,就可以使用 websock 方式来实现长连接。人家已经实现了心跳机制,用不着你自己开发。一旦客户端断开,立刻就能在服务器端抛出 closed 或者 error 事件,你就能将客户端的会话信息删除掉。 而对于其它类型的系统,你可以使用基于 TcpListener/TcpClient 的长连接方式。心跳是由服务器发出的,例如发一个“Ping”,那么客户端就必须在500毫秒内赶紧回一个“Pong”。如果超过1秒没有收到,那么服务器就判断客户端已经下线了。 心跳跟“踢掉登录”消息是完全不同的概念。当服务器要踢掉某个会话连接,直接发给它一个业务消息就行了。因此不要混淆。
  • 打赏
  • 举报
回复
引用 56 楼 sr35456 的回复:
[quote=引用 49 楼 qq_17416523 的回复:] LZ 加油 加油!!!!!
我就是不想做客户端心跳,打算用Wcf服务。这两天被netTcpBinding 的配置文件搅浑了。[/quote] wcf 又大又慢而且配置异常地繁琐复杂。你可以考虑使用websocket方式来从服务器推送消息给前端,不要考虑任何让你去纠结什么配置文件的方式。
SerenoShen 2015-10-10
  • 打赏
  • 举报
回复
简单粗暴的方案,分布式环境下采用一台(个)专用主机(或集群)负责登陆管理就行了,自行设计一下数据结构,一个账号对应一个唯一的指纹,这样重复登陆时自然会被捕获到!!!如果是单机环境问题就更简单了,心跳,令牌都能实现!!
  • 打赏
  • 举报
回复
引用 44 楼 wmxcn2000 的回复:
应该是客户端有一个心跳,5秒检测一次,检测到自己被 T 了,就主动下线。
想自动退出,只能做心跳检测了。
静静的湖人24 2015-10-09
  • 打赏
  • 举报
回复
通过数据库解决应该容易些吧..
qq_29584831 2015-10-09
  • 打赏
  • 举报
回复
楼主这个问题问得很好,我也正在寻求答案。
a180847229 2015-10-09
  • 打赏
  • 举报
回复
<script>alert("11");</script>
wuxiaoyan_1988 2015-10-09
  • 打赏
  • 举报
回复
上面都讲的太好了。客户端登录时产生标识;服务端存储该标识;客户端定时心跳比对标识;不一致则掉线
zhouzangood 2015-10-09
  • 打赏
  • 举报
回复
qq_31872153 2015-10-09
  • 打赏
  • 举报
回复
不是不能在异地登录吧,是一个账号不能在两个地点登录
qq_29941377 2015-10-09
  • 打赏
  • 举报
回复
应该是测心跳吧
zhllxt 2015-10-08
  • 打赏
  • 举报
回复
我说完之后忽然想起一个问题:我没有说出“同一帐号”不能在异地登录的具体细节。 比如有用户表,有三个字段 username password guid 每次登录时将生成的GUID值存在登录时所用的username对应的那条记录的guid字段中即可,定时判断时取出和当前username相同的那条记录里的guid字段里面的值与本地比较即可。 类似这个原理,其它办法都可以。
加载更多回复(60)

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧