如何让C/S应用支持多端(PC、Android、iOS)同时登录?
在C/S架构中,通常是使用 UserID 作为唯一标志来标记每一个用户的,也就是说,对于一个指定的UserID,只能有一个客户端在线。
如果我们开发的系统要支持同帐号多设备同时登录的场景,即需要像微信一样,在PC端登录的同时,也可以使用同一个帐号登录移动端(iOS或Android),那么,如何才能做到了?
解决方案的原理是比较简单的:既然C/S系统要求UserID作为用户标记必须是唯一的,那么我们就引入一个称为“LoginID”的概念,对于同一个用户,在不同类型的设备上就使用不同的LoginID,但是这些LoginID都指向同一个真正的UserID。
一. LoginID 与 UserID
1. 不需要支持同帐号多设备同时登录的简单场景
在之前不支持同帐号多设备同时登录的场景中(简称“单设备登录”场景),登录用的帐号就是真正的UserID,也就是说底层框架中各个API(各个方法以及事件)的参数涉及到的用户帐号都是真正的UserID。比如,一个帐号abc001,该帐号是存在于数据库的用户表中的;使用abc001登录到服务器,在整个的运作过程中,服务端正是使用abc001来标记对应的客户端实例。在该场景中,不会存在多个运行的客户端实例都对应帐号abc001的情况。如果有个客户端已经使用abc001登录,然后再用该帐号在其它地方登录,默认的机制是会把之前登录的那个客户端挤掉线。
2. 需要支持同帐号多设备同时登录的复杂场景
如果现在我们要支持同帐号多设备同时登录的场景(简称“多端登录”场景),那么,服务端在整个的运作过程中,就不能使用abc001来标记对应的客户端实例了,因为存在多个客户端实例都对应同一个abc001帐号的情况。于是,我们使用LoginID来区分这种情况下不同的客户端实例。
常用的方法是,在真正的UserID前加上两个字符的前缀以构成LoginID。 比如,对于abc001这个帐号,在使用iOS设备登录时,我们选择使用前缀“1#”,这样iOS设备使用的LoginID就是1#abc001;同理,Android设备就使用2#abc001。
该两个字符的前缀的含义是这样的:
(1)第二个字符“#”,是一个标志(token),表示该ID是一个LoginID。
(2)第一个字符,表示设备的类型。比如“0”表示.NET设备(PC),“1”表示iOS设备,“2”表示Android设备,等等。
当使用LoginID后,服务端在整个的运作过程中就不再是使用真正的UserID来标记客户端实例了,而是使用LoginID -- 也就是说,框架中各个API(各个方法以及事件)的参数涉及到的用户帐号都是LoginID了。
二. MultiDeviceHelper 类
我写了一个MultiDeviceHelper类,用于为多设备同时登录提供支持。特别是,提供了与LoginID的构造和解析相关的API。
在MultiDeviceHelper的静态构造函数中,规定了每种设备的前缀,如下所示:
static MultiDeviceHelper(){#region 如果在当前的应用中,不存在某种类型的设备,则注释掉下面对应的语句即可。 MultiDeviceHelper.LoginIDPrefixMapping.Add(ClientType.IOS, "1#");MultiDeviceHelper.LoginIDPrefixMapping.Add(ClientType.Android, "2#");MultiDeviceHelper.LoginIDPrefixMapping.Add(ClientType.DotNet, "3#"); #endregion}
然后, MultiDeviceHelper提供了多个静态方法以完成真正UserID、设备类型与LoginID之间的转换:
三. 登录和登录验证
客户端在登录时会调用IRapidPassiveEngine的Initialize方法:
LogonResponse Initialize(string userID, string logonPassword, string serverIP, int serverPort, ICustomizeHandler customizeHandler);
该方法的第一个参数就需要传入LoginID,比如 1#abc001。
在服务端会回调IBasicHandler接口的VerifyUser方法来进行帐号密码验证:
bool VerifyUser(string systemToken, string userID, string password, out string failureCause);
此时要注意的是,VerifyUser方法传入的userID参数实际上是LoginID,即 1#abc001。我们需要通过调用MultiDeviceHelper的ParseLoginID方法来获取真正的UserID,该方法会返回 abc001,并且out参数指明设备类型为iOS。
四. 处理消息及其它
服务端是通过回调ICustomizeHandler接口的HandleInformation方法来处理接收到的消息的:
void HandleInformation(string sourceUserID, int informationType, byte[] info);
同上面一样,此处的sourceUserID参数实际上也是LoginID,所以,也需要调用MultiDeviceHelper的ParseLoginID方法来将其转换成真正的UserID。
同理,在多设备登录场景中,框架中各个API(各个方法以及事件)的userID参数实际上都是LoginID,在处理时都需要做类似的处理,这里就不一一列举了。
五. 多设备聊天消息同步
在解决了多设备同时登录的问题后,还有一个常见的需求:类似QQ的PC和手机端同时在线时,别人给我发一条消息,手机端和PC端都能接收到。这样的功能是怎么实现的了?
在单设备登录场景中,我们通常是在客户端调用ICustomizeOutter接口的下列Send方法来发送聊天消息的:
void Send(string targetUserID, int informationType, byte[] info);
该方法的第一个参数是接收者的UserID,表示直接将聊天消息发送给对方(可能是经过服务器中转,或者是经P2P通道直接传送)。
但是,在多设备登录场景中,不能再直接发送了,而是必须要经过服务器中转,通过调用下面的Send方法:
void Send(int informationType, byte[] info);
该Send方法将消息直接发送给服务端,在info参数中包含要消息接收者的UserID。服务端在处理该消息时,需要从info中将接收者UserID解析出来,然后,调用MultiDeviceHelper 的 GetLoginIDList 方法来获取各个设备类型对应的LoginID,然后,服务端在把该消息发送给每一个LoginID。如此,手机端和PC端就都能收到这条聊天消息了。
(注:最新版本的 ESFramework.MSide.dll 已经内置了对多端同时登录的支持,也就是说,本文所阐述的原理已经在ESFramework框架中进行了实现。另外,OrayTalk 也增加了多端登录的功能,可下载测试。)
转载于:https://www.cnblogs.com/zhuweisky/p/11531553.html
如何让C/S应用支持多端(PC、Android、iOS)同时登录?相关推荐
- chrome调试h5移动端(含android,ios)
chrome调试h5移动端 chrome调试(window+android) 需要条件:1.安卓开发人员需要对你页面调试得webview添加setWebContentsDebuggingEnabled ...
- ios emjoi java_前端App开发,实际工作中三端(android,ios,前端H5)emoji表情显示解决方案...
想起最近开发APP的时候,产品提的一个需求,用户的帖子正文还有评论内容里,要能够显示emoji表情,因为我们这款app是混合开发的,APP里的发贴,发评论是原生做的(android和ios),但帖子详 ...
- 支持移动端深度学习的几种开源框架
原文:http://blog.csdn.net/zchang81/article/details/74280019 支持移动端深度学习的几种开源框架 1.Caffe的移动端项目 caffe项目连接如下 ...
- 开源在线考试系统推荐-支持web端和小程序
一.学之思在线考试系统 学之思在线考试系统是一款 java + vue 的前后端分离的考试系统.主要优点是开发.部署简单快捷.界面设计友好.代码结构清晰.目前支持web端和微信小程序,能覆盖到pc机和 ...
- 千月影视双端源码开源版_最新支持双端神器更新,属实有点牛逼!
目前我们的公众号至少为上万人提供过帮助,新来的小伙伴,如果你不想错过每一期福利的话,需要获取往期分享的福利,可以在菜单栏找到"软件目录"或"往期精彩"即可获取到 ...
- siwper vue 上下滑动分页_支持移动端的vue滑动轮播图插件vueswiper
一款支持移动端的vue滑动轮播图插件vueswiper,演示页面给出了5中范例:基本例子.垂直滚动.不定宽度.无缝循环滚动.多层级滚动,每一种都可以通过鼠标拖动图片来滑动,可以点击按钮来增加页面查看效 ...
- 新版本七彩影视双端源码+支持三端/对接苹果CMS
正文: 新版本七彩影视双端源码+支持三端/对接苹果CMS后台,三端包括PC,WAP,APP,系统功能强大,其它的就没什么好介绍的了,有兴趣的自行去搭建体验吧,有安装教程. 程序: wwsgdu.lan ...
- Unity 读取DICOM文件,并支持移动端
本文参考网上大神的源码,在此基础上修改,适配Unity,并支持移动端,本文代码支持安卓端,ios端请各位自行适配,原理不变,只是在数据读取的方法上可以有点区别. 大神原贴:医学影像调窗技术 - ass ...
- 微商城分销系统的怎么选择_有没有免费开源支持多端的_OctShop
说到微商城分销系统,经常刷微信朋友圈,微信群的朋友并不陌生,最初从卖红枣的,面膜的,发展到后来卖厨房用纸的,服装的.一批批微商城分销的链接,一张张的二维码名片充斥着朋友圈,很多朋友对此感到不甚厌烦的同 ...
- 不用下载软件也能打开EPUB?详解这款支持网页端的阅读器
EPUB阅读器大家都用过,我们使用过的EPUB阅读器几乎都是只支持电脑端或是手机端,亦或是只支持Android或是IOS,这就让我们的阅读体验大打折扣. 举个例子:假如有段时间,你在苹果手机上看一本书 ...
最新文章
- 1578: [Usaco2009 Feb]Stock Market 股票市场
- 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )
- centos7启动与切换图形界面
- mongodb聚合查询优化_【MongoDB】MongoDB 性能优化 - BI查询聚合
- 一种二叉树非递归遍历的简单写法
- Centos7.2 域名解析 /etc/resolv.conf 被覆盖
- Java NIO操作Socket的用法
- 神奇的go语言(面向对象)
- pandas——pd.DataFrame.iloc()
- Java 操作Word书签(二):添加文本、图片、表格到书签内容
- 档案管理学 | 档案实体管理概论
- java APP支付宝支付
- SQLite3 学习3
- 滴滴资深分析专家:数据如何驱动业务增长
- 配置的代理服务器未响应解决方法
- 2022年第十三届蓝桥杯省赛C/C++B组个人题解
- 并发和多线程(一)并发、进程、线程概念
- 系统并发量及常见性能指标
- 适合普通人的108个短视频项目:不用出镜也能赚钱的手机摄影玩法(3)
- 知识?一文解析币圈一级二级市场 原来币圈居然这么多要知道的