ESFramework Demo -- 动态组及群聊Demo(附源码)

       所谓“动态组”,就是在服务器内存中动态创建的组,不需要序列化存储到比如数据库或磁盘中,更像是一个临时的东西,需要的时候就创建一个,然后加入多个成员进行组内沟通,当不再使用的时候,就直接从内存中销毁了。在阅读本文之前,请务必先掌握ESFramework 开发手册(05) -- 好友与组 一文中介绍的关于组关系的基础知识以及相关API的用法。

      本Demo主要演示以下功能:

(1)创建动态组

(2)加入动态组

(3)在组内广播消息。(群聊)

(4)退出动态组

(5)销毁动态组  

一.公共定义

      对于一个C/S系统来说,客户端和服务端必需在某些定义上达成一致,比如信息类型的定义、协议类的定义等。DynamicGroupDemo.Core这个程序集就是我们这个demo用于公共定义的地方,它将被客户端和服务端共同使用。

      首先,我们要根据需求确定所需的自定义信息类型,我们用GroupInformationTypes静态类来表示: 

    public static class GroupInformationTypes
    {
        //Client -> Server
       public const int CreateGroup = 0;
        public const int JoinGroup = 1;
        public const int DestroyGroup = 2;
        public const int QuitGroup = 3;

        //Server -> Client
       public const int SomeoneJoinGroup = 4;
        public const int SomeoneQuitGroup = 5;
 
        //广播消息
       public const int GroupChat = 100; //群聊
    }

      然后,根据不同的信息类型,定义对应的信息协议类,像GroupContract、TextChatContract。

二.服务端

1.实现组管理器接口IGroupManager

      既然是要实现动态组的功能,那么服务端就必须实现IGroupManager接口,Demo里面定义了DynamicGroupManager类从IGroupManager接口继承。

      DynamicGroupManager类除了实现IGroupManager接口的方法以外,另外还实现了创建组、加入组、退出组和删除组的方法。

      为了框架能够使用我们自定义的组管理器DynamicGroupManager,我们必须在服务端引擎初始化之前,进行相关设置: 

  RapidServerEngine rapidServerEngine = new RapidServerEngine();
  DynamicGroupManager groupManager = new DynamicGroupManager();                
  rapidServerEngine.GroupManager = groupManager;
rapidServerEngine.Initialize(4530, new CustomizeHandler(groupManager));

       客户端想要进行动态组的操作,必须通过自定义消息把指令发送到服务端,所以服务端还必须实现ICustomizeHandler接口,Demo里面定义了CustomizeHandler类。

2.实现自定义处理器接口ICustomizeHandler

      服务端自定义处理器处理了创建组、加入组、退出组、销毁组等请求,并且当有人加入/退出组时,通知其他组成员。由于CustomizeHandler在处理这些请求时用到了组管理器,所以上面的代码,将组管理器的引用作为构造参数传递给自定义信息处理器。

      另外,群聊消息不需要被自定义处理器处理,它将直接由框架提供的广播机制进行自动转发。     

 三.客户端

1.封装工具类GroupTools           

      首先,我们将与组操作相关的动(如创建组、加入组等)作封装成一个类GroupTools,后面直接使用GroupTools就好了。封装成GroupTools的好处是,在以后我们正式的项目中,可以直接将其拷贝过去做适当的修改就可以用于我们自己的项目了。

      创建组(CreateGroup)的时候,调用RapidPassiveEngine的CustomizeOutter的Send方法发送GroupInformationTypes.CreateGroup类型的自定义信息给服务端即可 。

      加入组(JoinGroup)的时候,调用RapidPassiveEngine的CustomizeOutter的Query方法消息给服务端,等待服务端返回加入是否成功的结果。

    public bool JoinGroup(string groupID)
    {
        GroupContract contract = new GroupContract(groupID);
        byte[] resultBytes = this.rapidEngine.CustomizeOutter.Query(GroupInformationTypes.JoinGroup, CompactPropertySerializer.Default.Serialize<GroupContract>(contract));
        if (resultBytes != null)
        {
            return BitConverter.ToBoolean(resultBytes, 0);
        }
        return false;
    }

        除了CreateGroup、JoinGroup外,GroupTools还实现了QuitGroup和DestroyGroup方法。

2.UI与Demo逻辑

      用户登录成功以后,进入组选择的界面。可以自己创建一个组(默认组名和用户名一致),也可以加入已经存在的组(如果组存在,则加入成功;如果组不存在,则加入失败)。

      加入组或创建组成功后,就会进入到群聊的界面,可以开始群聊:

     

      群聊消息直接通过框架提供的IGroupOutter的Broadcast方法进行广播发送,客户端通过预定IGroupOutter的BroadcastReceived事件来处理接收到的群聊消息。

      客户端通过IGroupOutter的GroupmateConnected和GroupmateOffline事件,来得到组友的上下线通知。

      要注意的是,我们在demo中还处理了以下几种情况:

(1)成员加入组或组成员上线的时候,客户端会将其显示在组成员列表中。

(2)如果组成员掉线或退出组,服务端自动将其从组中移除,客户端则将其从组成员列表中移除。

(3)如果自己掉线重连成功后,会重新加入之前的组。 

 四.源码下载

(1)ESFramework.Demos.DynamicGroup 源码

(2)ESFramework.Boosts 源码:ESFramework 增强库,里面有动态组(DynamicGroup)的标准可复用实现。

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

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

Q Q:168757008

官网:www.oraycn.com

导航

首页

官方网站

立即咨询 

站内搜索

ESFramework 通信框架

详细说明

SDK下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK下载

OMCS FAQ

版本变更记录

OrayTalk 企业即时通讯系统

详细说明

客户端下载

傲瑞实用组件

SDK下载

NPush 消息推送组件

StriveEngine 轻量级的通信引擎

MFile 语音视频录制组件

MCapture 语音视频采集组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

傲瑞组件 FAQ

授权

授权流程

产品授权说明

产品选购指南

授权SDK使用说明

其它

SDK使用技巧

联系我们

电话:027-87638960

Q Q:168757008

邮件:master@oraycn.com