代码参考

代码文件参考下述详解的类图,工程参考第零章工程说明

关键特性

  • 对Socket库进行封装,抹平Socket的Window&Linux的平台差异。
  • C++嵌入lua脚本,增加开发者编码效率,减少编译时间消耗。
  • 非阻塞网络IO
  • 多线程任务模型
  • 多服务模型

详解

Socket库封装



主要是对C++的Socket库进行封装,使其更加易用,抹平window和linux平台差异

  • SocketMgr:Socket模块的门面(外观模式),提供TCPSocket、UDPSocket的创建接口以及Select多描述符非阻塞IO的封装
  • TCPSocket:TCP长连接Socket的connect、bind、listen等等接口的封装
  • UDPSocket:UDP短连接Socket的封装,同上。
  • SocketAddress:Socket地址信息IP地址、端口等封装
  • SocketAddressFactory:简单工厂,封装创建SocketAddress细节

服务器引擎

  • Engine:整个程序的主循环,管理线程Worker和Service,负责Worker、Service、Msg的处理调度。
  • Service:包含处理基础消方法息由Worker更新处理,其多态体现其的lua对象中
  • ConnWriter:网络消息写入器
  • WriteObj:消息写入上下文
  • Worker:工作线程的封装,处理Service的消息
  • SocketWorker:网络消息线程,读写网络消息
  • Conn:保存连接描述符等信息
  • Msg:消息基类,驱动Service的逻辑更新
  • SocketRWMsg:Socket可读可写(其中一个或者全部)时通知。
  • SocketAcceptMsg:Socket建立连接时通知。
  • ServiceMsg:其他服务消息通知。
  • LuaAPI:向Lua虚拟机注入C++方法

消息处理模型时序图



注意事件的分发推入和消息的处理不是连续的。消息进来后尝试唤醒线程,线程更新时处理消息。具体逻辑代码参考

  • 消息进来:Engine.Send
  • 消息处理:Worker的()运算符重载方法

多服务



服务的多态使用lua编写,开发效率较高。每个服务可能开多个:例如login可以建立多个服务,处理逻辑时可以使用随机分配一个等策略以实现均衡负载。

  • gate(Service):负责隔离客户端和服务,客户端和服务之间的消息由gate转发,同是统一编码解码
  • MsgProcesser:编码器
  • Config:服务配置文件,查询服务的id以通信。
  • LoginService...:具体的业务服务

其他

  • C++ 实现锁机制,linux平台自带锁的库文件,但windows貌似没有,为了抹平这部分平台差异,选择自己开发,包含:

    • SpinLock 自旋锁
    • RWLock 读写锁

Multiserver游戏服务器Demo[C++&Lua]的更多相关文章

  1. Scut游戏服务器免费开源框架-3

    Scut游戏服务器免费开源框架--快速开发(3) Scut快速开发(3) 1        开发环境 需要安装的软件 a)        消息队列 b)        数据库,Sql2005以上版本 ...

  2. unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计

    unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计 最近做玩票性质的游戏项目,客户端技术是 unity3d 和 android. ...

  3. 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

    使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?和C Socket服务器比起来有什么优劣?可行性怎么样? 从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方 ...

  4. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  5. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍

    2013年04月19日 14:09:37 MJiao 阅读数:4614   深入浅出node.js游戏服务器开发1——基础架构与框架介绍   游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...

  6. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  7. 游戏服务器菜鸟之C#初探四游戏服务

    经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...

  8. Redis在游戏服务器中的应用

    排行榜游戏服务器中涉及到很多排行信息,比如玩家等级排名.金钱排名.战斗力排名等.一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合.但是有时 ...

  9. c++游戏服务器编程学习笔记(一)TCP/IP

    1. c++游戏服务器编程c++运行效率非常高2. TCP传输控制协议IP网际协议Socket 3.Linux 乌班图开源第三方库BOOST 4.80%游戏服务器端用C++工作量最大的地方是具体的游戏 ...

  10. 游戏服务器ID生成器组件

    游戏服务器程序中,经常需要生成全局的唯一ID号,这个功能很常用,本文将介绍一种通用ID生成组件.游戏服务器程序中使用此组件的场景有: 创建角色时,为其分配唯一ID 创建物品时,每个物品需要唯一ID 创 ...

随机推荐

  1. flex弹性盒子中flex-grow与flex的区别

    ​大家在使用flex布局的时候很多情况下都会用到flex-grow这个属性, flex-grow 属性用于设置父元素剩余空间的瓜分比例, flex 属性是 flex-grow.flex-shrink  ...

  2. Salesforce Javascript(三) 小结1

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions https://developer.mozi ...

  3. 如何提取 x64 程序那些易失的方法参数

    一:背景 1. 讲故事 最近经常遇到有朋友反馈,在 x64 环境下如何提取线程栈中的方法参数,熟悉 x64 调用协定的朋友应该知道,这种协定范围下,方法的前四个参数都是用寄存器传递的,比如rcx,rd ...

  4. boss直聘自动化爬取招聘信息

    自己百度下载一个scrpy(爬虫框架) 不知博客园咋传文件 百度网盘 永久访问 链接:https://pan.baidu.com/s/1_-5lnnTj_qs9d_jtWkFgcA 提取码:x3ur

  5. 驱动开发:内核使用IO/DPC定时器

    本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果 ...

  6. Barplot/pie/boxplot作图详解——R语言

    当数据以简单的可视化的形式呈现时,数据便更具有意义并且更容易理解,因为人眼很难从原始数据中得出重要的信息.因此,数据可视化成为了解读数据最重要的方式之一.条形图和箱线图是了解变量分布的最常用的图形工具 ...

  7. [数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)

    1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它 ...

  8. Windows 下无法使用 C++11 标准 thread 类

    问题描述 最近需要在 windows 平台使用 C++ 多线程编程,编译时提示错误 thread is not a member of std, or you maybe forget '#inclu ...

  9. PHP大文件分割上传 PHP分片上传

    这篇文章主要为大家详细介绍了PHP大文件分割上传,PHP分片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_ma ...

  10. 【从零开始】Docker Desktop:听说你小子要玩我

    前言 缘由 捡起遗忘的Docker知识 由于本狗近期项目紧任务重,高强度的搬砖导致摸鱼时间下降.在上线项目时,看到运维大神一系列骚操作,docker+k8s的知识如过眼云烟,忘得干净的很.所以想重新恶 ...