MMO中的聊天服务主要功能就是做客户端之间的聊天内容转发。但是聊天的形式有很多,例如私聊、同场景聊、队伍内聊、工会内聊、全服务器聊、甚至临 时组建房间聊。这些逻辑功能其实都是可以做在逻辑服务器上的,最多改改世界服务器,但是这样完成功能的话,不免将聊天本身的逻辑与游戏逻辑关联起来。我们 希望做得更上一层,将聊天服务本身脱离开来。但是独立聊天服务还不够,因为就算独立出来了,也有可能在实现上与具体的游戏逻辑相关联。所以,我们做了进一 步的抽象,想实现一个更为通用的聊天服务器。

设计实现

实体设计

聊天这个过程,我们将其抽象为实体(entity)与实体间的对话。这个实体概念其实很宽泛。任何可接收聊天消息的都算做实体,例如单个玩家、一个 场景、一个队伍、一个房间、一个工会、甚至整个服务器。这个思想其实就是支持整个聊天服务器设计的最根本思想。最开始,我将聊天服务器分为个体和组两个概 念,其实这个抽象程度都太低,并且会导致实现上的复杂。相反,将整个系统完全使用实体这个概念来组装,就简单很多。当然,实体是有很多种类的,在处理接收 聊天消息这个动作时,其处理方式就不同。例如单个玩家实体仅做消息的发送,场景实体则是将消息发给场景内的所有玩家,队伍实体就是将消息发给队伍内的所有 玩家。从这一点来看,我们的实体种类其实并不多,因为场景、队伍这些,都是组实体(group entity)。用C++来描述:

classEntity {public://send text to this entityvirtualboolSend(Entity*sender,conststd::string&text)=0;protected:

GUID m_id;intm_type;

};classSockEntity : pubilc Entity {public:virtualboolSend(Entity*sender,conststd::string&text) {//find the map socket and send text to the socketlongsocket=FindSocket(this);

Message msg(MSG_CS2E_SENDTEXT);

msg.Add(sender->ID());

msg.Add(text);

msg.SendToSocket(socket);returntrue;

}

};classGroupEntity :publicEntity {public:virtualboolSend(Entity*sender,conststd::string&text) {for(std::list::const_iterator it=m_mems.begin(); it!=m_mems.end();++it) {

(*it)->Send(sender, text);

}returntrue;

}private:

std::listm_mems;

};

SockEntity用于表示物理上聊天服务器的客户端,例如游戏客户端。

网络拓扑

实际上,除了转发聊天内容外(Entity::Send),实体还有很多其他行为,例如最起码的,创建组实体,往组实体里添加成员等。在设计上,组 实体的创建由逻辑服务器或者其他服务器来完成,目前游戏客户端是没有创建组实体的权限的(实现上我们还为实体添加了权限验证机制)。在网络拓扑上,聊天服 务器始终是作为服务器角色,而它的客户端则包括游戏客户端、逻辑服务器、甚至其他服务器,这样聊天服务器在提供了固定的协议后,它就是完全独立的,不依赖 任何其他组件:

CS/|\/|\/|\

GC   GC   GS

(CS: Chat Server, GC: Game Client, GS: Game Server)

基于此,我们扩充了Entity的类体系:

classClientEntity :publicSockEntity {private:

GUID m_gsEntity;//标示该客户端实体位于哪个逻辑服务器实体上};classGSEntity :publicSockEntity {

};

消息协议

聊天服务器的核心实现,其实就是针对以上实体做操作。因此,聊天服务器的消息协议方面,也主要是针对这些实体的操作,包括:

创建

实体的创建很简单,不同的实体其创建所需的参数都不一样。例如客户端实体创建时需要传入一个逻辑服务器实体的ID,组实体的创建可以携带组成员实体列表。 为了处理权限和安全问题,在具体实现上,逻辑服务器实体的创建是由聊天服务器本地的配置决定,即聊天服务器启动则根据配置创建好逻辑服务器实体;客户端实 体是当角色进入逻辑服务器后,由服务器创建,客户端无法创建实体。

删除

实体的删除为了处理方便,约定删除请求必须由实体的创建者发起。因为从逻辑上将,某个模块如果可以创建一个实体,那么其必然知道什么时候该删除这个实体。

修改

修改指的是修改实体内部实现的一些属性,例如组实体修改其组成员。这个操作是非常重要的。对于SockEntity而 言,修改意味着修改其连接状态,例如当逻辑服务器在聊天服务器上创建了客户端实体后,实际上此时客户端并没有在网络方面连接聊天服务器,此时这个Entity实 际上是不可用的,因为它无法用于发送消息。这个时候我们标志该实体的状态为非连接状态。当客户端主动连接上聊天服务器后,客户端就主动发起修改自己对应的 客户端实体请求,该请求将自己的状态修改为连接状态。当客户端关闭时,聊天服务器网络层接收到连接断开通知,该通知肯定是早于逻辑服务器发来的删除实体通 知的,此时将该客户端实体状态修改为断开状态,并在接收到逻辑服务器删除实体通知时将其真正删除。这里展示的这种状态修改策略,实际上在整个系统中是非常 重要的。它用于指导网络连接和上层逻辑之间的关系,因为整个聊天系统中,各个进程的状态是不可预料的(随时可能宕掉),当某个进程尤其是逻辑服务器宕掉 后,聊天服务器是得不到任何正常逻辑通知的,它只能得到网络连接的通知。

总结

整个系统实现下来,实际上是非常简单的,代码量也很少。当然还有很多细节问题,例如聊天信息中携带物品信息,这涉及到异步预处理聊天内容,这里就不 方便细说了。

java做mmo服务器_MMO聊天服务器设计相关推荐

  1. Java做服务器开发语言

    随着游戏市场的兴起,特别是网页游戏.手机游戏的崛起,对游戏开发技术的需求越来越多.网络游戏开发是一个庞大的体系,总体来说是客户端与服务器端.客户端是玩家接触的游戏图像显示端,服务器是处理游戏运行中的各 ...

  2. Java实现即时聊天:聊天服务器+聊天客户端+Web管理控制台

    来源:cnblogs.com/blogtimes/p/14767484.html 一.前言 说实话,写这个玩意儿是我上周刚刚产生的想法,本想写完后把代码挂上来赚点积分也不错.写完后发现这东西值得写一篇 ...

  3. java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2

    1. 从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新 ...

  4. java制作安卓客户端,java做服务器,android干客户端,实现数据传输

    java做服务器,android做客户端,实现数据传输 许久未动笔,有个小项目开始动工. 需要用一台windows电脑做服务器,在android端与其进行数据交换,实现一些业务. 简单起见,用java ...

  5. 用Java实现的eChat聊天服务器

    摘要:与一般的ASP聊天室不同,这种聊天服务器是完全独立的服务端程序.当它运行的时候先监听端口,一旦用户通过浏览器访问,便模拟WEB服务器通过HTTP和用户通讯.由于使用了Java技术,所以安全性以及 ...

  6. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

  7. 实战即时聊天,一文说明白:聊天服务器+聊天客户端+Web管理控制台。

    目录 一.前言 二.最终效果 1.聊天服务器 2.聊天客户端 3.Web管理控制台 三.需求分析 四.概要设计 1.技术选型 1)聊天服务端 2)Web管理控制台 3)聊天客户端 4)SpringBo ...

  8. 做一个简单的游戏服务器

    为什么其实不重要! 做一个简单网游服务器. 服务由两部分构成,网关和世界服务器,绞尽脑汁,还没有想到一个好听的名字,可以肯定的是要code n行,就暂定CodeN {N >= 0}. 语言选用C ...

  9. 深入浅出Node.js游戏服务器开发--分布式聊天服务器搭建

    From: http://www.infoq.com/cn/articles/game-server-development-2?utm_source=infoq&utm_medium=rel ...

  10. (十二)nodejs循序渐进-高性能游戏服务器框架pomelo之创建一个游戏聊天服务器

    上个章节我们简单介绍了下pomelo的安装和目录结构,有读者可能觉得有点吃不消,为什么不再深入讲一讲目录结构和里边的库,这里我就不费口舌了,大家可以去官网参考文档说明,本文只告诉大家如何利用这个框架来 ...

最新文章

  1. 湖北地区的一些主要DNS服务器
  2. Software--Architecture--Design
  3. numpy 最大值_使用 NumPy 让你的 Python 科学计算更高效
  4. 3d相册 html 代码_女朋友生日,我送她网页相册,她感动的哭了(文中有惊喜)...
  5. 统一并发 IV——走向跨平台
  6. RawNet代码解析
  7. 自动发消息到微信提醒
  8. ssm产品销售管理系统计算机毕业设计
  9. sklearn:make_blobs聚类数据生成器
  10. 使用Mixamo绑定骨骼导入动画
  11. laravel路由的配置,别名,路由群组
  12. 机器学习面试题之逻辑回归(二)
  13. matlab文献资料,matlab文献资料查找方法及资源汇总
  14. C语言输入10个分数 去掉最高分,vb输入10个评委给出的分数,去掉最高分和最低分,计算平均分并输出...
  15. 在javascript中 setInterval()、clearInterval()、clearTimeout()等等常用的函数的含义
  16. 读者-写者问题代码(带注释)个人学习笔记
  17. 手动搭建T版openstack平台(不会你还不学)
  18. matlab预测缺失,matlab数据缺失预测
  19. 人脸识别(cv2,face_recognition)
  20. java k均值相异度计算_K-NN算法与K-Means算法的原理与区别(附带源码示例)

热门文章

  1. uva-10041-水题
  2. 平衡二叉树、B树、B+树,B*树的区别与联系
  3. zmud之汉字转换为数字
  4. 东子破解jms7月2号
  5. python arduino i2c1602_Arduino使用I2C转接板驱动1602液晶屏,小小白新手入门篇
  6. Vivado IP核之定点数转为浮点数Floating-point
  7. 如何整合JIRA、FishEye、Crucible进行CodeReview
  8. hp-unix操作系统root账号被锁定的两种解决方法:
  9. csma研究背景_以太网CSMA_CD工作原理研究
  10. 【英语六级】【仔细阅读】(4)