在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)同时登录?相关推荐

  1. chrome调试h5移动端(含android,ios)

    chrome调试h5移动端 chrome调试(window+android) 需要条件:1.安卓开发人员需要对你页面调试得webview添加setWebContentsDebuggingEnabled ...

  2. ios emjoi java_前端App开发,实际工作中三端(android,ios,前端H5)emoji表情显示解决方案...

    想起最近开发APP的时候,产品提的一个需求,用户的帖子正文还有评论内容里,要能够显示emoji表情,因为我们这款app是混合开发的,APP里的发贴,发评论是原生做的(android和ios),但帖子详 ...

  3. 支持移动端深度学习的几种开源框架

    原文:http://blog.csdn.net/zchang81/article/details/74280019 支持移动端深度学习的几种开源框架 1.Caffe的移动端项目 caffe项目连接如下 ...

  4. 开源在线考试系统推荐-支持web端和小程序

    一.学之思在线考试系统 学之思在线考试系统是一款 java + vue 的前后端分离的考试系统.主要优点是开发.部署简单快捷.界面设计友好.代码结构清晰.目前支持web端和微信小程序,能覆盖到pc机和 ...

  5. 千月影视双端源码开源版_最新支持双端神器更新,属实有点牛逼!

    目前我们的公众号至少为上万人提供过帮助,新来的小伙伴,如果你不想错过每一期福利的话,需要获取往期分享的福利,可以在菜单栏找到"软件目录"或"往期精彩"即可获取到 ...

  6. siwper vue 上下滑动分页_支持移动端的vue滑动轮播图插件vueswiper

    一款支持移动端的vue滑动轮播图插件vueswiper,演示页面给出了5中范例:基本例子.垂直滚动.不定宽度.无缝循环滚动.多层级滚动,每一种都可以通过鼠标拖动图片来滑动,可以点击按钮来增加页面查看效 ...

  7. 新版本七彩影视双端源码+支持三端/对接苹果CMS

    正文: 新版本七彩影视双端源码+支持三端/对接苹果CMS后台,三端包括PC,WAP,APP,系统功能强大,其它的就没什么好介绍的了,有兴趣的自行去搭建体验吧,有安装教程. 程序: wwsgdu.lan ...

  8. Unity 读取DICOM文件,并支持移动端

    本文参考网上大神的源码,在此基础上修改,适配Unity,并支持移动端,本文代码支持安卓端,ios端请各位自行适配,原理不变,只是在数据读取的方法上可以有点区别. 大神原贴:医学影像调窗技术 - ass ...

  9. 微商城分销系统的怎么选择_有没有免费开源支持多端的_OctShop

    说到微商城分销系统,经常刷微信朋友圈,微信群的朋友并不陌生,最初从卖红枣的,面膜的,发展到后来卖厨房用纸的,服装的.一批批微商城分销的链接,一张张的二维码名片充斥着朋友圈,很多朋友对此感到不甚厌烦的同 ...

  10. 不用下载软件也能打开EPUB?详解这款支持网页端的阅读器

    EPUB阅读器大家都用过,我们使用过的EPUB阅读器几乎都是只支持电脑端或是手机端,亦或是只支持Android或是IOS,这就让我们的阅读体验大打折扣. 举个例子:假如有段时间,你在苹果手机上看一本书 ...

最新文章

  1. 1578: [Usaco2009 Feb]Stock Market 股票市场
  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 准备 DEX 字节码文件 )
  3. centos7启动与切换图形界面
  4. mongodb聚合查询优化_【MongoDB】MongoDB 性能优化 - BI查询聚合
  5. 一种二叉树非递归遍历的简单写法
  6. Centos7.2 域名解析 /etc/resolv.conf 被覆盖
  7. Java NIO操作Socket的用法
  8. 神奇的go语言(面向对象)
  9. pandas——pd.DataFrame.iloc()
  10. Java 操作Word书签(二):添加文本、图片、表格到书签内容
  11. 档案管理学 | 档案实体管理概论
  12. java APP支付宝支付
  13. SQLite3 学习3
  14. 滴滴资深分析专家:数据如何驱动业务增长
  15. 配置的代理服务器未响应解决方法
  16. 2022年第十三届蓝桥杯省赛C/C++B组个人题解
  17. 并发和多线程(一)并发、进程、线程概念
  18. 系统并发量及常见性能指标
  19. 适合普通人的108个短视频项目:不用出镜也能赚钱的手机摄影玩法(3)
  20. 知识?一文解析币圈一级二级市场 原来币圈居然这么多要知道的

热门文章

  1. EOSIO 指南(浏览源码)
  2. 解析百度Apollo自动驾驶平台
  3. Node.js 4.0 中的 ES 6 特性介绍
  4. 《Spark Cookbook 中文版》一导读
  5. description方法 oc 就是NSLog使用
  6. Keil/MDK(0):使用过程中的一些设置
  7. 64位内核第三讲,Windbg的使用.以及命令
  8. 2019东南大学研究生课程计算机网络安全
  9. 轻松搭建Redis缓存高可用集群
  10. Python3—元组