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)如果自己掉线重连成功后,会重新加入之前的组。

 

四.源码下载

ESFramework.Demos.DynamicGroup 源码

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

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

关于ESFramework的任何问题,欢迎联系我们:

电话:027-87638960

Q Q:372841921


消息部分:<br>1.ESFramework介绍之(1)――网络通信消息协议接口IContract<br><br>2.ESFramework介绍之(2)――网络通信消息NetMessage<br> <br>3.ESFramework介绍之(3)――消息处理器和处理器工厂<br><br>4.ESFramework介绍之(4)――消息拦截器INetMessageHook <br><br>5.ESFramework介绍之(5)――消息分派器IMessageDispatcher<br><br>6.ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy <br><br>7.ESFramework介绍之(31)―― 消息分类及对应的处理器 <br><br><br>通信基础设施(Tcp、Udp)<br>1.ESFramework介绍之(21)-- Tcp组件接口ITcp介绍 <br><br>2.ESFramework介绍之(23)―― AgileTcp <br><br>3.ESFramework介绍之(28)―― Udp组件<br><br><br>基于C/S的4层架构:<br>1.ESFramework介绍之(6)―― 基于C/S的4层架构概述 <br><br>2.ESFramework介绍之(10)-- Tcp连接池<br><br>3.ESFramework介绍之(11)-- Tcp连接池管理器<br><br>4.ESFramework介绍之(12)―― 基于Tcp连接池的消息处理器 <br><br>5.ESFramework介绍之(13)-- 功能插件处理器工厂<br><br>6.ESFramework介绍之(14)-- AS与FS通信方案 <br><br>7.ESFramework介绍之(15)-- IRAS<br><br>8.ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求 <br><br>9.ESFramework介绍之(18)―― Tcp用户管理器组件 <br><br>10.ESFramework介绍之(19)―― 对动态组ActiveGroup的支持 <br><br>11.ESFramework介绍之(24)―― 日志记录IEsbLogger <br><br>12.ESFramework介绍之(26)-- 支持复杂插件(InnerDealer 和 InnerDispatcher) <br><br>13.ESFramework介绍之(27)-- 支持OverdueMessage <br><br>14.ESFramework介绍之(29)―― 插件公共设施 AddinUtil <br><br>15.ESFramework介绍之(33)―― AS与FS通信实现及相关 <br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值