`
feipigwang
  • 浏览: 750675 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ESFramework介绍之(19)―― 对动态组ActiveGroup的支持

 
阅读更多

什么是动态组?举个例子就清楚了。QQ支持多人在一个组中聊天的模式是群,这是一种静态组;而MSN中的动态的将多个人拉到一个组中来群聊,就是动态组。关于动态组,还有一个很好的例子,就是多人联网游戏,比如联网的星际。首先由发起者创建一个组(动态组),然后其它玩家加入进来开始游戏,游戏结束了,该动态组就销毁了。所以说,动态组是个“临时性的”,生命比较短暂;而静态组,通常被存储于永久介质(如数据库)中,即使这场游戏结束,这个组依然存在,如。

ESFramework对静态组的支持是“好友管理器”――IFriendManager(存在于ESFramework V0.1+),而对动态组的支持主要是ESFramework.Network.ActiveGroup(存在于ESFramework V0.2+)命名空间。

在服务器运行的过程中,可能需要创建成百上千的动态组,所有这些动态组需要被管理起来,这个管理者就是IActiveGroupManager。动态组管理器主要有以下职责:
(1)根据请求创建/销毁动态组。
(2)将某用户加入到某动态组。
(3)将某用户从动态组中移除。
(4)将组消息在指定的组内广播。
(5)查询所有动态组的消息。

根据上述职责描述,可以定义IActiveGroupManager接口:

1 publicinterfaceIActiveGroupManager
2{
3boolCreateGroup(stringcreator,stringgroupName);//如果有同名的group存在、则返回false
4boolDestroyGroup(stringuserID,stringgroupName);//如果无权删除、则返回false
5
6JoinGroupResultJoinGroup(stringuserID,stringgroupName);
7voidDropoutFromGroup(stringuserID,stringgroupName);
8voidBroadcastMessage(stringsourceUserID,stringdestGroupName,NetMessagemsg);//在目标组内广播消息
9
10ICollectionGroups{get;}
11boolCreatorOwner{set;}//如果为true,表示只有创建者才有权DestroyGroup
12IToClientSenderToClientSender{set;}
13}
14
15publicenumJoinGroupResult
16{
17Succeed,GroupIsNotExist,MaxSized
18}

CreatorOwner属性表明是否只有组的创建者才有权销毁组。ESFramework中IActiveGroupManager接口的参考实现是ActiveGroupManager。IActiveGroupManager管理的对象是动态组,那么动态组的定义了、它有哪些职责:
(1)管理组内所有用户,支持用户加入组、从组中撤出。
(2)维护组的最大容量。如果当前Size已经达到最大容量,则无法再加入用户
(3)当组为空时,触发GroupEmptied事件。应用可以处理该事件,比如从管理器中删除对应的组。
动态组接口IActiveGroup定义如下:

1 publicinterfaceIActiveGroup
2{
3stringCreator{get;}//创建者
4stringGroupName{get;}
5intCount{get;}
6intMaxSize{get;set;}
7
8IListUserList{get;}
9
10boolAddUser(stringuserID);//当达到MaxSize时,返回false
11voidRemoveUser(stringuserID);
12
13eventCbSimpleGroupEmptied;
14}

ESFramework中IActiveGroup接口的参考实现是EsbActiveGroup。
为了能处理来自客户端的动态组请求/消息,我们先要能区分它,我们消息类型枚举中增加定义:

1publicenumServiceType
2{
3Basic,//IBasicRequestDealer
4Function,
5P2PMessage,//对于P2P消息,服务器仅仅转发,P2PMessageDealer
6FriendRelation,//如好友列表、好友资料等,FriendRelationDealer
7GroupMessage,//如多人联网游戏中的同步消息等
8CustomServiceType//自定义服务种类
9}

接着,对于GroupMessage这个大类,我们需要进一步细分:

publicenumActiveGroupMessageType
{
Create,
//需要回复-创建是否成功
Destroy,//需要回复-销毁是否成功
Join,//需要回复-加入是否成功
DropoutFromGroup,//不需要回复
Broadcast//如游戏同步消息,不需要回复
}

为了使ESFramework能一致的处理所有的GroupMessage,我们设定了IActiveGroupMessage接口,所有的GroupMessage都可以转换到这个接口:

///<summary>
///IGroupMessageActiveGroup消息的基础接口,所有的组消息协议都要实现此接口。
///zhuweisky2006.04.06
///</summary>
publicinterfaceIActiveGroupMessage
{
stringGroupName{get;}
ActiveGroupMessageTypeActiveGroupMessageType{
get;}
}

另外,我们需要一个帮手来实现这个转换:

publicinterfaceIActiveGroupHelper
{
IActiveGroupMessageParseGroupMessage(NetMessagemsg);
}

好了,一切就绪了,我们只差一个对应的消息处理器来处理所有的GroupMessage,这个消息处理器就是ActiveGroupMessageDealer,它借助于IActiveGroupManager实现了对所有GroupMessage的处理,下面给出它的实现源码:

ActiveGroupMessageDealer
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1 publicclassActiveGroupMessageDealer:IDataDealer
2{
3publicActiveGroupMessageDealer()
4{
5}
6
7#regionProperty
8#regionActiveGroupHelper
9privateIActiveGroupHelperactiveGroupHelper=null;
10publicIActiveGroupHelperActiveGroupHelper
11{
12set
13{
14this.activeGroupHelper=value;
15}
16}
17#endregion
18
19#regionActiveGroupManager
20privateIActiveGroupManageractiveGroupManager=null;
21publicIActiveGroupManagerActiveGroupManager
22{
23set
24{
25this.activeGroupManager=value;
26}
27}
28#endregion
29#endregion
30
31#regionIDataDealer成员
32
33publicNetMessageDealRequestMessage(NetMessagereqMsg)
34{
35IActiveGroupMessagegroupMsg=this.activeGroupHelper.ParseGroupMessage(reqMsg);
36if(groupMsg==null)
37{
38returnnull;
39}
40
41IMessageHeaderresHeader=(IMessageHeader)reqMsg.Header.Clone();
42
43switch(groupMsg.ActiveGroupMessageType)
44{
45caseActiveGroupMessageType.Create:
46{
47boolsuc=this.activeGroupManager.CreateGroup(reqMsg.Header.UserID,groupMsg.GroupName);
48resHeader.MessageBodyLength=0;
49resHeader.Result=suc?1:ServiceResultType.GroupIsExist;
50returnnewNetMessage(resHeader,null);
51}
52caseActiveGroupMessageType.Destroy:
53{
54boolsuc=this.activeGroupManager.DestroyGroup(reqMsg.Header.UserID,groupMsg.GroupName);
55resHeader.MessageBodyLength=0;
56resHeader.Result=suc?1:ServiceResultType.NoPermissionToDestroyGroup;
57returnnewNetMessage(resHeader,null);
58}
59caseActiveGroupMessageType.Join:
60{
61JoinGroupResultresult=this.activeGroupManager.JoinGroup(reqMsg.Header.UserID,groupMsg.GroupName);
62resHeader.MessageBodyLength=0;
63resHeader.Result=ActiveGroupMessageDealer.ConvertServiceResultType(result);
64returnnewNetMessage(resHeader,null);
65}
66caseActiveGroupMessageType.DropoutFromGroup:
67{
68this.activeGroupManager.DropoutFromGroup(reqMsg.Header.UserID,groupMsg.GroupName);
69returnnull;
70}
71caseActiveGroupMessageType.Broadcast:
72{
73this.activeGroupManager.BroadcastMessage(reqMsg.Header.UserID,groupMsg.GroupName,reqMsg);
74returnnull;
75}
76default:
77{
78returnnull;
79}
80}
81}
82
83#endregion
84
85#regionConvertServiceResultType
86publicstaticintConvertServiceResultType(JoinGroupResultresult)
87{
88switch(result)
89{
90caseJoinGroupResult.GroupIsNotExist:
91{
92returnServiceResultType.GroupIsNotExist;
93}
94caseJoinGroupResult.MaxSized:
95{
96returnServiceResultType.GroupSizeLimited;
97}
98caseJoinGroupResult.Succeed:
99{
100returnServiceResultType.ServiceSucceed;
101}
102default:
103{
104returnServiceResultType.ServiceSucceed;
105}
106}
107}
108#endregion
109}

最后,我们将ActiveGroupMessageDealer处理器添加到默认的处理器工厂EsbRequestDealerFactory中。(代码略)
说明一下,ActiveGroup的命名空间是ESFramework.Network.ActiveGroup,表明其与协议是无关的,即它可以用于Tcp协议,也可以用于Udp协议。
感谢关注!

上一篇文章:ESFramework介绍之(18)―― Tcp用户管理器组件

转到:ESFramework 可复用的通信框架(序)

分享到:
评论

相关推荐

    ESFramwork2.0

    - IRAS &lt;br&gt;8.ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求 &lt;br&gt;9.ESFramework介绍之(18)―― Tcp用户管理器组件 &lt;br&gt;10.ESFramework介绍之(19)―― 对动态组ActiveGroup的支持 ...

    Macbook录屏软件,KAP,开源免费

    Macbook上免费的,最简单好用的,干净清洁的,不占资源的录屏软件。 从某度上搜索“Macbook录屏软件”,前几页全部都是各种各样的收费软件 再从某度上搜索“Macbook 免费录屏软件”,还是会出现各种各样的收费软件推荐,然后会有OBS studio。obs也挺好的,不过osb操作有点复杂,对于只需要简单录屏来说,根本用不到obs stidio。

    pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    20石膏板吊顶工程.doc

    20石膏板吊顶工程

    算法部署-基于OpenVINO+Python部署YOLOv9目标检测算法-附项目源码+一键执行-优质项目实战.zip

    算法部署_基于OpenVINO+Python部署YOLOv9目标检测算法_附项目源码+一键执行_优质项目实战

    Python语言教程Python语言教程

    Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程Python语言教程

    tensorflow-rocm-2.10.1.540-cp310-cp310-manylinux2014-x86-64.whl

    tensorflow安装

    CISCO 思科 固件 ASR1002-X asr1002x-universalk9.17.09.03a.SPA.bin

    CISCO 思科 固件 软件 IOS OS ASR1002-X asr1002x-universalk9.17.09.03a.SPA.bin

    grpcio-1.24.3-cp34-cp34m-win32.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    协同过滤推荐项目+源代码+文档说明

    - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    JavaScript js运算符 示例代码

    本资源文件是js运算符相关学习代码的示例 包含算术运算符、比较运算符、逻辑运算符等 JavaScript 是一种广泛使用的脚本语言,主要用于网页和Web应用程序的客户端开发。 JavaScript(简称JS)是一种轻量级、解释型、动态类型的脚本语言,主要用于网页前端开发,但也被广泛用于服务器端和移动应用开发。它最初由Netscape公司的Brendan Eich在1995年为Netscape Navigator浏览器设计,目的是增强网页交互性。 JavaScript 是一种广泛使用的脚本语言,主要用于网页和Web应用程序的客户端开发。 JavaScript(简称JS)是一种轻量级、解释型、动态类型的脚本语言,主要用于网页前端开发,但也被广泛用于服务器端和移动应用开发。它最初由Netscape公司的Brendan Eich在1995年为Netscape Navigator浏览器设计,目的是增强网页交互性。 JavaScript 是一种广泛使用的脚本语言,主要用于网页和Web应用程序的客户端开发。 JavaScript(简称JS)是一种轻量级、解释型、动态类型的脚本语言,主要用于网页前端

    pyzmq-25.0.0-cp39-cp39-musllinux_1_1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Paragon NTFS for mac无限试用的办法和工具

    亲测15.10.590版本是可以用的,其他版本理论上也可以;本工具可以在该软件试用期已经过期的情况下重新获取10天试用期

    基于ssm框架小型企业办公自动化系统毕业论文

    第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环境与技术 3 2.1 MYSQL数据库 3 2.2 JSP技术 3 2.3 SSM框架 4 2.4 Vue框架 4 第3章 系统分析 6 3.1 可行性分析 6 3.1.1 技术可行性 6 3.1.2 经济可行性 6 3.1.3 操作可行性 6 3.2 系统流程 7 3.2.1 操作流程 7 3.2.2 登录流程 7 3.2.3 删除信息流程 8 3.2.4 添加信息流程 9 3.3 性能需求 9 3.4 功能需求 10 第4章 系统设计 15 4.1 设计原则 15 4.2 功能结构设计 15 4.3 数据库设计 17 4.3.1 数据库概念设计 18 4.3.2 数据库物理设计 21 第5章 系统实现 26 5.1 管理员功能实现 26 5.1.1 部门经理管理 26 5.1.2 总经理管理 26 5.1.3 审批流程管理 27 5.1.4 通知公告管理 27 5.2 部门经理功能实现 28 5.2.1 员工管理 28 5.2.2 员工留言管理 28 5.2.3 员工工资管理 29 5

    ferry开源工单系统源代码

    工单系统相关功能: 工单提交申请 工单统计 多维度工单列表,包括(我创建的、我相关的、我待办的、所有工单) 自定义流程 自定义模版 任务钩子 任务管理 催办 转交 手动结单 加签 多维度处理人,包括(个人,变量 (创建者、创建者负责人)) 排他网关,即根据条件判断进行工单跳转 并行网关,即多个节点同时进行审批处理 通知提醒(目前仅支持邮件) 流程分类管理 权限管理相关功能,使用 casbin 实现接口权限控制: 用户、角色、岗位的增删查改,批量删除,多条件搜索 角色、岗位数据导出 Excel 重置用户密码 维护个人信息,上传管理头像,修改当前账户密码 部门的增删查改 菜单目录、跳转、按钮及 API 接口的增删查改 登陆日志管理 左菜单权限控制 页面按钮权限控制 API 接口权限控制v

    网络安全相关的密码学.docx

    网络安全相关的密码学是保护信息在存储、传输和处理过程中免受未经授权访问和篡改的关键技术。以下是对网络安全中密码学的清晰介绍,包括其基本概念、加密算法、应用场景和重要性等方面的内容: 一、密码学基本概念 密码学是研究秘密通信的科学与技术,是实现安全信息交换的基础。 密码学主要分为密码编码学和密码分析学。密码编码学主要研究对信息编码,实现对信息的隐蔽;而密码分析学则主要研究加密消息的破译或信息的伪造。 密码系统由明文空间、密文空间、密码方案和秘钥空间组成。其中,明文是未经加密的原始信息;密文是经过伪装后的明文;密码方案包括加密算法和解密算法;秘钥是加密和解密算法的操作在称为秘钥的元素的控制下进行。 二、加密算法 对称加密算法:主要特点是加解密使用同一个密钥,且加密解密速度较快。常见的对称加密算法包括DES(数据加密标准)、AES(高级加密标准)和RC4等。其中,DES的密钥长度为56位,但已经容易被暴力破解;而AES支持128位、192位和256位密钥长度,安全性较高。 非对称加密算法:使用一对密钥:公钥与私钥。加密使用公钥,解密使用私钥。R

    ssm美食推荐管理系统源码

    这份文档是一篇关于开发美食推荐管理系统的毕业设计论文。论文详细介绍了该系统的研究背景、现状、设计目标、需求分析、设计方案、实现过程以及系统测试。以下是对文档内容的简介: - **研究背景**:随着信息科学化的发展,科学化的管理在提高工作效率和促进发展方面的重要性日益凸显。 - **开发技术**:系统采用JSP技术进行开发,后台数据库使用MySQL,系统架构遵循B/S(浏览器/服务器)结构。 - **主要用户**:系统的主要使用者包括管理员和普通用户,为他们提供个性化的界面和服务。 - **功能模块**:系统包含多个功能模块,如管理员的用户管理、美食分类管理、热门美食管理、美食教程管理、美食店铺管理、美食社区和系统管理等;用户则可以进行个人中心管理、美食教程管理、我的收藏管理等。 - **系统设计**:文档详细论述了系统的设计过程,包括需求分析、系统架构设计、数据库设计等。 - **系统测试**:论文对系统测试的意义、测试方法和测试分析进行了详细说明,确保系统功能完善、操作简便、运行稳定。 - **结论**:作者通过开发美食推荐管理系统,体会到了学习新技术的重要性和实践经验

    MAVEN 教程和详细讲解

    MAVEN 教程和讲解

    CCT-VB2021(上)模拟考试(2)

    CCT-VB2021(上)模拟考试(2)

Global site tag (gtag.js) - Google Analytics