`
feipigwang
  • 浏览: 745908 次
  • 性别: 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的支持 ...

    基于三层感知机实现手写数字识别-内含源码和说明书.zip

    基于三层感知机实现手写数字识别-内含源码和说明书.zip

    setuptools-40.7.0.zip

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

    搭建VGG16神经网络实现图像分类-内含源码和说明书.zip

    搭建VGG16神经网络实现图像分类-内含源码和说明书.zip

    setuptools-40.6.1.zip

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

    华为OD机试D卷 - 判断字符串子序列 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    安享智慧理财测试项目Mock服务代码

    安享智慧理财测试项目Mock服务代码

    基于STM32单片机的智能晾衣架.zip

    基于单片机的系统

    Mamba selective-scan-cuda-linux-gnu.so

    安装成功后,还是遇到ImportError xxxx selective_scan_cuda.cpython-xxx-linux-gnu.so undefined symbol,用此编译好的文件进行替换即可

    基于Java EE的停车场管理系统.zip

    如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤,私家车的数量越来越多,商场停车难得问题凸显,对于停车场的合理利用有助于缓解用户停车压力,鉴于这样的背景;初步设定系统功能主要包括,用户信息管理,违规车辆信息管理,刷卡停车牌管理,停车位信息管理,停车计费,信息查看管理等功能模块。本系统采用JAVAEE开发形式,利用数据库来完成数据存储功能,运用了B/S形式的开发模式,严格按照了软件工程的开发模式进行开发,保证系统的良好运行。

    华为OD机试D卷 - 免单统计 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    setuptools-2.2.tar.gz

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

    ASP.NET《数据库原理及应用技术》课程指导平台的开发(源代码)

    ASP.NET《数据库原理及应用技术》课程指导平台的开发(源代码)

    setuptools-40.4.2.zip

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

    setuptools-54.0.0-py3-none-any.whl

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

    基于SpringBoot+Hadoop的评价预测系统的设计与实现+部署文档+全部资料 高分项目.zip

    【资源说明】 基于SpringBoot+Hadoop的评价预测系统的设计与实现+部署文档+全部资料 高分项目.zip基于SpringBoot+Hadoop的评价预测系统的设计与实现+部署文档+全部资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    利用python的pyautogui函数实现简单的自动化操作

    1.安装python3.4以上版本,并配置环境变量(目前有装3.9遇到坑的,我个人用的3.7.6) 教程:https://www.runoob.com/python3/python3-install.html 2.安装依赖包 方法:在cmd中(win+R 输入cmd 回车)输入 pip install pyperclip 回车 pip install xlrd 回车 pip install pyautogui==0.9.50 回车 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 回车 pip install pillow 回车 这几步如果哪步没成功,请自行百度 如 pip install opencv-python失败 3.把每一步要操作的图标、区域截图保存至本文件夹 png格式(注意如果同屏有多个相同图标,回默认找到最左上的一个,因此怎么截图,截多大的区域,是个学问,如输入框只截中间空白部分肯定是不行的,宗旨就是“唯一”) 4.在cmd.xls 的sheet1 中,配置每一步的指令,如指

    setuptools-8.0.4.tar.gz

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

    setuptools-18.7.1.zip

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

    setuptools-20.6.7.zip

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

Global site tag (gtag.js) - Google Analytics