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端会触发 IFileOutterFileTransDisruptted 事件,事件参数是新加的枚举值: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多端版本的AndroidiOS的SDK,其修改与PC版本是完全一致的,不再赘述。

二.如何将现有的基于ESFramework的项目升级到多端版本?

(1)SDK的名称中包含了MSide标志的,表示其是多端版本。

(2)服务端和PC端,删除ESFramework.dll的引用,改为引用 ESFramework.MSide.dll。移动端也是类似修改。

(3)如果项目中用到了ESFramework.Boost 扩展库,也改为使用对应的多端版本。这里可以下载 ESFramework.Boost.MSide.rar。 

                

-----------------------------------------------------------------------------------------------------------------------------------------------   

下载免费版本的ESFramework 以及 demo源码  

阅读 更多ESFramework开发手册系列文章

Q Q:168757008

官网:www.oraycn.com

导航

首页

官方网站

联系我们

立即咨询 

站内搜索

ESFramework 通信框架

详细说明

SDK与Demo下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK与Demo下载

OMCS FAQ

版本变更记录

OrayTalk 企业即时通讯系统

详细说明

客户端下载

OVCS 视频会议系统

详细说明

源码下载

傲瑞实用组件

SDK下载

H5Media 纯网页音视频交互

NPusher 推流组件

MCapture 语音视频采集组件

MFile 语音视频录制组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

StriveEngine 轻量级的通信引擎

傲瑞组件 FAQ

授权

授权流程

产品选购指南

授权方案说明

授权SDK使用说明

其它

支持信创国产化

SDK使用技巧

联系我们