目录:

MMO游戏服务器从零开发(架构篇)

MMO游戏服务器从零开发(架构篇)- 网络部分


游戏服务器的网络分为2部分:

外网通信:服务器与客户端进行的网络数据交互。

对于使用java外网通信毋庸置疑的选择Netty。对于游戏服务器而言,Netty的外网通信只存在于网关部分。其他逻辑、数据、等仅使用内网通信组件(ZeroMQ)即可。

线程划分:

  • Netty启动需要一个线程进行监听。并且监听之后需要阻塞。ch.closeFuture().sync();则会进行阻塞。这个线程主要处理socket的连接请求。新的socket建立,然后根据一定的分配逻辑将建立成功的socket连接分配到消息处理线程。
@Overridepublic void run() {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {// 启动netty监听ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 10240).childOption(ChannelOption.TCP_NODELAY, true).childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();p.addLast(new Decoder(), new Encoder(), new ServerHandler());}});LogCore.core.info("启动监听:{}", listenPort);// 启动Channel ch = b.bind(listenPort).sync().channel();ch.closeFuture().sync();} catch (Exception e) {throw new SysException(e);} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
  • 的消息处理多线程(这里处理包括消息的接收和消息的发送),为什么消息处理需求多线程呢?这个看游戏的类型和延迟性要求,对于socket一个线程每秒可以处理的消息量也是十分巨大,记忆很多年前,我用c++的iocp单线程,每秒可以处理几十万个消息包。每秒的流量也可以达到上百M。但是虽然单个线程能处理这么大的消息量,但再大量消息包处理时会导致一定的消息延迟,特别是外挂恶意破解了消息包,然后进行大量消息包的恶意攻击。这个时候单线程的消息处理模式将会很容易导致问题。本人强烈建议使用多线程处理socket的连接。

结构解析:

对于网关的socket连接,每个连接将会封装成一个Connection对象,Connection对象的一端是负责与Clinet的通信,另外一端负责与内网的其他逻辑进行通信,这里的通信不是用Netty,而是通过ZeroMQ进行数据传输。与Zmq的通信将不在是想socket的一对一的通信,他是一种M对N模式的通信,并且逻辑上也会经常变动通信节点。比如:socket连接后,先与登录进程处理登陆请求,选择角色处理。之后角色进入场景,需要将消息转发到对应场景节点。当角色跳转场景,还能可能再次变更通信节点。具体的在zmq部分再做介绍。

内网通信:内部服务器之间的网络数据交互。

MMO游戏服务器从零开发(架构篇)- 网络部分相关推荐

  1. 游戏服务器Mina框架开发

    游戏服务器Mina框架开发 作者:老九-技术大黍 社交:知乎 公众号:老九学堂(新人有惊喜) 特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权 前言 如果要使用Java语言来开发游戏 ...

  2. Java游戏服务器成长之路——感悟篇

    又是一个美好的周末啊,现在一到周末,早上就起得晚,下午困了又会睡一两个小时,上班的时候,早上起来喝一杯咖啡,然后就能高效的工作一整天,然而到了周末人就懒散了,哈哈. 最近刚跳槽,到新公司已经干了有两周 ...

  3. golang游戏服务器项目,基于Golang的游戏服务器框架cellnet开发日记(一)

    启程的故事 使用Golang写服务器是一件非常幸福的事情. 不用长时间的等待编译, 零依赖部署. 开发效率高, 多出的时间陪陪家人, 看书充充电多好. 所以Golang就像是手机界的苹果, 从发布后, ...

  4. 利用游戏服务器引擎Matchvs开发联网微信小游戏

    Matchvs是一款十分易用的游戏服务器引擎,开发者通过SaaS层提供的API,即可完成"就近"节点接入.玩家匹配.游戏数据通信的建立:PaaS提供GS开发框架.托管平台,无需自有 ...

  5. mmo游戏服务器性能指标,关于performance:厚积薄发MMORPG手游合理的性能参数

    1)MMORPG手游正当的性能参数 ​2)应用ScriptableBuildPipeline打包的疑难 3)如何获取到Animation批改材质球色彩后的色彩值 4)嵌套预设AssetBundle打包 ...

  6. java 039 s rule_Java开发架构篇:DDD模型领域层决策规则树服务设计

    沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅仅只是从一个简单的分层结构上依然没法理解DDD以及如何去开发 ...

  7. 《从零开始搭建游戏服务器》Linux开发环境配置

    前言: 之前的开发工作一直是在Windows开发环境下进行的,但是正真发布和外网运营势必要发布到Linux环境下,而且有很多服务端的工具对于Windows系统的兼容性并不是非常完善,就像常用的Dock ...

  8. 解码mmo游戏服务器四:如何实现玩家状态的高同步性

    问题引入:这里主要讨论状态同步,client A发生状态变化(移动,换装,属性变化等),将变化的信息同步到client B,最简单做法就是直接通过服务器中转然后广播出去,但是由于存在网络延迟,所以cl ...

  9. 华为鸿蒙2048小游戏,《从零开发鸿蒙小游戏App》直播答疑(包含新版2048游戏代码)...

    请到附件中下载新版2048游戏代码.最好能对该代码再做一些优化(见下述问题8),欢迎感兴趣的朋友随时跟我探讨,^_^ 问题1:如何将开发的Lite Wearable项目部署在鸿蒙手表Watch GT2 ...

最新文章

  1. python中的daemon守护进程实现方法
  2. omnidb数据库web管理工具安装
  3. [OS][FS]查看ext3文件系统分区的superblock
  4. Netflix Zuul与Nginx的性能对比
  5. 如何备份和还原Firefox设置
  6. (1)、win10 本地 安装 rabbitmq
  7. pycharm下防止鼠标拖拽代码字符
  8. 天邑ty1208z海思3798刷版本_[乐天固件]魔百和M301H-当贝版卡刷包-海思3798M
  9. 砂.随笔.十七.谋定而后动
  10. 六大IT运维服务管理问题总结
  11. 手机内存如何快速自清理
  12. html の第一天(上)-----适合新手入门前端
  13. 转1:Python字符编码详解
  14. 模拟量输入输出模块的用途是什么?
  15. web前端工程师的分工安排
  16. LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)
  17. 【STL】STL空间配置器
  18. Excel如何拆分sheet(宏功能应用)
  19. 计算二叉树的深度和叶子结点数
  20. 资产盘点帐实相符的条码录入Excel方法

热门文章

  1. python虚拟机下载_虚拟机 python
  2. msfvenom生成木马攻击-Windows10实现自己黑自己
  3. uni-app 今天也要努力写项目NO.1
  4. Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由
  5. android时间格式化
  6. 一行代码教你撩妹手到擒来❤html+css+js烟花告白3D相册(含音乐+可自定义文字)520表白/七夕情人节/求婚
  7. 华为v2服务器系统安装系统,华为服务器RH 2288H v2安装系统
  8. 组装办公室用计算机,(需要组装一批电脑,用于办公。多运用于普通办公软件,WORD、EXCEL、PPT、PS等。 要求实惠,可用集成显卡。)组装电脑excle模板...
  9. c++基础题:判断某整数是正整数、负整数还是零
  10. mysql 取top 10_我的mysql如何分组取top10?