ESFramework 开发手册(15) -- 多端同时登录
ESFramework v6.8 新增了一个版本 -- 多端版本,之前的普通版本仍然保留。
多端版本与普通版本的区别在于:普通版本(ESFramework.dll)对于一个用户帐号,只允许登录一个设备,比如我们用A帐号登录了PC端,然后又在安卓端登录了A帐号,那么,PC端就会被挤下线。而多端版本(ESFramework.MSide.dll)则允许同一个帐号同时在PC/Android/iOS设备上登录。
一.多端版本API变化说明
多端版本的API与普通版本相比变化不大,主要是某些方法增加了ClientType参数(用于说明消息发出的设备类型),以及增加了用于多端设备之间同步的API。多端版本API的变化具体如下所描述。
1. IBasicOutter 接口修改
IBasicOutter在多端版本中增加下面三个元素:
/// <summary> /// 当我的其它设备上线时,触发此事件。 /// </summary> event CbGeneric<ClientType> MyDeviceOnline; /// <summary> /// 当我的其它设备下线时,触发此事件。 /// </summary> event CbGeneric<ClientType> MyDeviceOffline; /// <summary> /// 获取自己的在线设备。 /// </summary> List<ClientType> GetMyOnlineDevice();
可以通过这三个元素,实时知道自己有哪些设备在线。
2. ICustomizeHandler接口修改
自定义消息处理器ICustomizeHandler在多端版本中的定义如下:
public interface ICustomizeHandler { /// <summary> /// 处理接收到的自定义信息。 /// </summary> /// <param name="sourceUserID">发送该信息的用户ID。如果为null,表示信息发送者为服务端。</param> /// <param name="clientType">客户端设备类型</param> /// <param name="informationType">自定义信息类型</param> /// <param name="info">信息</param> void HandleInformation(string sourceUserID, ClientType clientType , int informationType, byte[] info); /// <summary> /// 处理接收到的请求并返回应答信息。 /// </summary> /// <param name="sourceUserID">发送该请求信息的用户ID。如果为null,表示信息发送者为服务端。</param> /// <param name="clientType">客户端设备类型</param> /// <param name="informationType">自定义请求信息的类型</param> /// <param name="info">请求信息</param> /// <returns>应答信息</returns> byte[] HandleQuery(string sourceUserID, ClientType clientType, int informationType, byte[] info); }
新增的clientType参数,说明了当前消息是从哪个设备发出来的。
3. IContactsOutter 接口修改
IContactsOutter接口中的联系人上下线事件修改为联系人的设备上下线通知,其在多端版本中的定义如下:
/// <summary> /// 当联系人的某设备上线时,触发该事件。参数:UserID - ClientType /// </summary> event CbGeneric<string, ClientType> ContactsDeviceConnected; /// <summary> /// 当联系人的某设备下线时,触发该事件。参数:UserID - ClientType /// </summary> event CbGeneric<string, ClientType> ContactsDeviceDisconnected; /// <summary> /// 当联系人的所有设备都下线时,触发该事件。参数:UserID /// </summary> event CbGeneric<string> ContactsOffline; /// <summary> /// 当接收到某个组内的广播消息(包括大数据块信息)时,触发此事件。参数:broadcasterID - broadcasterClientType - groupID - broadcastType - broadcastContent - tag。 /// 如果broadcasterID为null,表示是服务端发送的广播。 /// </summary> event CbGeneric<string, ClientType, string, int, byte[], string> BroadcastReceived;
BroadcastReceived 事件新增加的clientType参数,说明了当前广播消息是广播者从哪个设备发出来的。
4. 文件传送相关修改
假设A同时登录了PC和安卓,当B发送一个文件请求给A时,A在PC和安卓上会同时收到这个请求,如果A在安卓上回复了这个请求(同意或拒绝接收文件),那么,A的PC端会触发 IFileOutter 的FileTransDisruptted 事件,事件参数是新加的枚举值:FileTransDisrupttedType. AnswerFileRequestOnOtherDevice,表示在其它设备上回复了文件请求。
5.IRapidPassiveEngine 接口修改
(1)IRapidPassiveEngine的发送消息的方法增加 toOtherClientOfMine 参数,以指示服务端是否将该消息转发给自己的其它设备。
/// <summary> /// 向服务器或其它在线用户发送消息。如果其它用户不在线,消息将被丢弃。 /// </summary> /// <param name="targetUserID">接收者的UserID,如果为服务器,则传入null</param> /// <param name="informationType">消息类型</param> /// <param name="message">消息内容</param> /// <param name="tag">附加内容</param> /// <param name="toOtherClientOfMine">是否发送给我的其它在线设备</param> void SendMessage(string targetUserID, int informationType, byte[] message, string tag ,bool toOtherClientOfMine = false); /// <summary> /// 向服务器或其它在线用户发送消息。如果其它用户不在线,消息将被丢弃。 /// </summary> /// <param name="targetUserID">接收者的UserID,如果为服务器,则传入null</param> /// <param name="informationType">消息类型</param> /// <param name="message">消息内容</param> /// <param name="tag">附加内容</param> /// <param name="fragmentSize">消息将被分块发送,分块的大小</param> /// <param name="toOtherClientOfMine">是否发送给我的其它在线设备</param> void SendMessage(string targetUserID, int informationType, byte[] message, string tag, int fragmentSize, bool toOtherClientOfMine = false);
(2)IRapidPassiveEngine的MessageReceived事件增加ClientType参数:
/// <summary> /// 当接收到来自服务器或其它用户的消息时,触发此事件。 /// 事件参数:sourceUserID - ClientType - informationType - message - tag 。 /// 如果消息来自服务器,则sourceUserID为null。 /// </summary> event CbGeneric<string, ClientType, int, byte[], string> MessageReceived;
ClientType参数说明了当前消息是从哪个设备发出来的。
(3)IRapidPassiveEngine 增加 EchoMessageReceived事件
假设A登录了PC和安卓,然后A在安卓上通过上述(1)的SendMessage 发消息给B,并将 toOtherClientOfMine参数传入true时,则A的PC端会触发EchoMessageReceived事件。
/// <summary> /// 当(当前用户在其它客户端设备上发送了消息)时,触发此事件。 /// 事件参数:clientType - destUserID - informationType - message - tag 。 /// 如果原消息的接收者为服务器,则destUserID为null。 /// </summary> event CbGeneric<ClientType, string, int, byte[], string> EchoMessageReceived;
第一个参数ClientType,表示我在哪个设备上发出了消息。
第二个参数string,表示我发送的这个消息是给谁的(消息接收者的UserID)。
对于ESFramework多端版本的Android与iOS的SDK,其修改与PC版本是完全一致的,不再赘述。
二.如何将现有的基于ESFramework的项目升级到多端版本?
(1)SDK的名称中包含了MSide标志的,表示其是多端版本。
(2)服务端和PC端,删除ESFramework.dll的引用,改为引用 ESFramework.MSide.dll。移动端也是类似修改。
(3)如果项目中用到了ESFramework.Boost 扩展库,也改为使用对应的多端版本。这里可以下载 ESFramework.Boost.MSide.rar。
-----------------------------------------------------------------------------------------------------------------------------------------------
Q Q:168757008