Jueast / Mserverdemo

简易的练习用网游服务器轮子..

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mserver简介

Mserver是一个简易的网游服务器端demo,主要用于支持一个简易的多人在线文字冒险游戏。主要使用boost.asio完成异步io与多线程支持。 诸多功能尚未完成。

服务端架构

                     ____ ____ _  _ ____ ____ ____ ____ _  _ ____ ____ 
                     | __ |__| |\/| |___ [__  |___ |__/ |  | |___ |__/ 
                     |__] |  | |  | |___ ___] |___ |  \  \/  |___ |  \ 
                                                                            
                     |====================================================|
                     | [ResourceMgr]----------{ConfigFiles}               |
                     |   |           ^-------------------------------+    |
|========|           |---+----|      ^        |----+-----|---->|-----+----|
| Client |--[Mpack]--+ NetMgr |<--[Mpack]---->| StateMgr |     | LogicMgr |
|========|           |-- + ---|               |--- + ----|<----|----------|
                     |   |                         |                      |
                     | [LoginSrv]------------------┤                      |
                     |============================ | =====================|
                                                   |
                                              [UDPServer]
                                                   |
                                              |=== + ====|
                                              |  DBGate  +---[MySQL Server]
                                              |==========|


拥有dbgategameserver两个进程,前者作为数据库中间件对数据库进行操作,后者作为服务器主进程完成运行逻辑等任务。

gameserver:

使用以boost.asioio_service为基础的所有模块共享的线程池,除初始化外均使用异步io,使用strand处理相关同步问题。

  • NetMgr(NetworkManager)完成网络相关io任务并维护链接状态,外部使用TCP长连接,内部使用UDP收发消息
  • StateMgr(StateManager)完成游戏世界和玩家相关状态的更新、查询,并定期提交数据修改至dbgate
  • LoginSrv处理登录/注册/账号管理等相关服务, 现未实装, 职能由NetMgr中相关函数实现,使用pugixml实现
  • ResourceMgr处理配置文件加载管理,更新等任务, 现未实装, 职能由各各模块自行处理
  • LogicMgr处理游戏世界相关业务逻辑,预计使用嵌入脚本语言方式实现,未实装

dbgate:

  • UDPServer完成内部消息包(Mpack)的解析
  • MDBManager完成数据库相关业务

Mpack相关

使用统一的protobuf包(Mpack)传递消息,相关定义参看proto/mpack.proto。内部使用CONTROL类别进行标记。 游戏相关数据分为PlayerWorld两部份,目前两者均实现为以无符号整数为键,字符串或无符号整数为值的字典。

NetworkManager

分为处理外部消息的TCP部分和内部控制消息的UDP部分,

TCP:

TCPServer-NetworkSession-NetworkConnection三层结构:

  • TCPServer接受TCP链接请求,并创建NetworkSession,并提供相关接口(deliver)用于发送消息至对应链接。
  • NetworkSession维护会话状态(登录等),并解析相关请求,提交作业(Mpack形式)至相关模块(StateMgr等)
  • NetworkConnectionMpack进行打包传输等底层任务

UDP:

  • 使用协程方式编程,建立临时端口与dbgate进行通讯,完成数据收发、同步、登录验证等任务
  • 维护dbgate地址等内部信息

StateManager

对外提供添加工作的接口(addTask),内部使用回调函数循环不断完成相关工作。

数据存储:

内存中数据分为PlayersWorld两部分,前者为以uid为键,Mpack定义的数据结构为值的数据结构,后者直接使用Mpack中相关定义。

数据同步:

  • 相关修改发生时会进行相关记录用于同步,以此来持久化数据。
  • 现每30s会定时同步一次
  • 直到收到dbgate相关的确认后才刷新同步信息

MDBManager

使用mysql++实现,使用智能指针实现链接池对链接进行管理。

日志模块logging

现支持简单的自动轮替、分层次输出等,切分、自动删除等尚未实装

典型的运行过程

                  ./dbgate -> dbgate启动
                  ./gameserver -> gameserver启动
                     |
                     |
                     |----> 请求最新`World`数据--->dbgate
                     |                              |
                     |<----返回相关数据----------------
                     |
         挂载(Mount)World数据至StateManager
                     |
                监听TCP链接请求
 Client--发起链接-----|
   |                 |
   |----登录请求-->处理登录请求
   |                 |----> 发送登录验证请求---->dbgate
   |                 |                            |
   |                 |<----返回相关数据--------------
   |              验证成功
   |                 |----> 请求最新用户数据---->dbgate
   |                 |                            |
   |                 |<----返回相关数据--------------
   |     挂载(Mount)Player数据至StateManager
   |                 |
   |<-------返回成功信息,修改会话状态
   |----数据请求-->处理数据请求
   |                 |
   ...................
   ...................
   |                 |
   |<------------返回数据包
   |                 |----> 定时同步修改数据---->dbgate
   |                 |                            |
   |                 |<----返回确认-----------------
   |             刷新同步信息
   |                 |
   断开链接------ >确认链接断开,卸载用户数据
                     |
                     |
                     |
                     ...
  

About

简易的练习用网游服务器轮子..

License:The Unlicense


Languages

Language:C++ 87.6%Language:Python 10.0%Language:Makefile 2.4%