muduo网络库使用心得

muduo网络库使用心得

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

上个月看了朋友推荐的mudo网络库,下完代码得知是国内同行的开源作品,甚是敬佩。下了mudo使用手冊和035版的代码看了下结构,感觉是一个比較成熟并且方便使用的网络库。本人手头也有自己的网络库,尽管不敢说是一个多强大的网络库,但毕竟在外网也稳定运营了几年,多组同一时候在线也跑过30w左右,单组server也能跑上w人。做游戏server几年的经验,感觉稳定性才是网游server最核心最重要的环节,效率还在其次,这也是眼下网游server普遍採用分组架构决定的,从运营的角度来看,有时候一组server即使上限能跑上w人,但运营会强制把上限定位几k人,这里面跟游戏玩法还有运营的手段有关系,就不细说了! 


muduo採用的是基于消息回调机制的reactor模式,这也是眼下网络库经常使用的模式。整个网络库的使用比較方便,仅仅须要关心几个tcp事件:tcp连接,收数据,tcp关闭等,这几个事件分别注冊好回调函数就能够简单使用。具体的用法看 陈硕的muduo网络库使用手冊就能够。

      假设要把muduo结合到一般的游戏server里面,则最主要的还须要添�组包和打包,假设是对外通讯则还须要加解密模块。參考的方法例如以下:


第一步,须要定义一个 gameserver这种基类,该类负责做为游戏tcp服务端(无论是网关服务器或者逻辑服务器都等都可能须要使用tcp服务端),所以必须包括tcpserver,并把tcp的接受连接和收数据,关闭连接等事件注冊到tcpserver的回调。


第二步:当tcp连接回调onconnection之后,须要new一个新的logicsession(该logicsession就是负责处理数据组包和加解密,消息队列等的类),能够建立一个tcpconnection指针到logicsession的映射。 当tcp连接回调onmessage之后,依据tcpconnection键值找到logicsession,把数据push到logicsession类

      第三步: logicsession收到数据后,须要定义一个消息队列类,比如msgqueqe类,负责把收到的二进制数据解密组包等操作,而且把组好的包存放到消息队列中,以供之后的游戏逻辑使用。

    完毕了以上几步之后,能够開始干活了。比如要建立一个游戏网关,则仅仅须要定义一个clientserver类继承gameserver(定义clientserver的原因是由于每一个tcp服务所要做的事情可能都不一样,所以须要依据自身需求实现自己的子类,比如游戏网关肯定是要统计连接人数等,则须要在clientserver中暴露获取logicsession个数的接口),并new一个clientserver传入port,比如port20000,则開始侦听来自20000port的tcp连接,接收到连接数据后,自己主动由logicsession处理并保存到每一个连接自己的消息队列中。假设游戏服务器逻辑是单线程的,则接着仅仅须要启动一个线程遍历全部来自20000port的logicsession,而且把每一个logicsession的消息队列pop出来,而且分发到对应的消息处理模块统一处理。这样就能够完毕一次简单的从客户端到游戏网关的tcp数据收发和处理。


(未完,待续)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118196.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月9日 下午4:00
下一篇 2021年12月9日 下午4:00


相关推荐

  • mysql executequery返回值_使用executequery数据库

    mysql executequery返回值_使用executequery数据库iOS 数据库操作之 FMDBSQLite 一种轻量级关系数据库 在嵌入式系统中使用比较广泛 在 iOS 中使用 SQLite 需要添加库 libsqlite3 0 dylib 并引入头文件 importFMDB 对 sqlit 接口进行了高级封装 使用上更加友好简洁 https gi 文章沉默术士 2017 07 031178 浏览量 iOS 数据库操作之 FMDBSQLite 一种轻量级关系数据库 在嵌入式系统中使用

    2026年3月19日
    2
  • python怎么安装pymysql_python安装PyMySQL

    python怎么安装pymysql_python安装PyMySQL1 确定 Python 版本和 scripts 目录下有 pip exe 运行 cmd 管理员 进入后输入 python 确定版本指定到 python 下 scripts 目录下 然后输入 pip 确认是否已安装 pip 一般是已经安装的 2pip 安装 PyMySQL3 案例 连接数据库并执行查询 importdateti cursors 连接配置信息 config

    2026年3月17日
    2
  • Qt树形控件QTreeView使用1——节点的添加删除操作[通俗易懂]

    Qt树形控件QTreeView使用1——节点的添加删除操作[通俗易懂]QTreeView和QStandardItemModel的使用QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点)。1. QStandardItemModel在QTreeView中的使用使用QTree

    2022年6月5日
    412
  • 终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?「建议收藏」

    终极对决!Dubbo 和 Spring Cloud 微服务架构到底孰优孰劣?「建议收藏」前言核心部件1总体架构2微服务架构核心要素通讯协议1支持协议2性能比较服务依赖方式组件运行流程微服务架构组成以及注意事项1架构分解2注意事项总结前言微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影

    2022年6月19日
    34
  • matplotlib的安装教程以及简单调用

    matplotlib的安装教程以及简单调用1.matplotlib的下载我们的常规下载方式就是在命令行中输入:`pipinstallmatplotlib`,这样你就可以从官方进行下载,但是这样的下载速度是十分的慢的,我们在最详细的AnacondaInstallers的安装【numpy,jupyter】(图+文)(https://chen-ac.blog.csdn.net/article/details/122374025?spm=1001.2014.3001.5502)这一博客中曾写到,可以在`pipinstallmatplo

    2022年6月15日
    91
  • [转] 理解NLP中的卷积&&Pooling「建议收藏」

    [转] 理解NLP中的卷积&&Pooling「建议收藏」[转] 理解NLP中的卷积&&Pooling

    2022年4月20日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号