Mserver
是一个简易的网游服务器端demo,主要想用于支持一个简易的多人在线文字冒险游戏。主要使用boost.asio
完成异步io与多线程支持。
诸多功能尚未完成。
____ ____ _ _ ____ ____ ____ ____ _ _ ____ ____
| __ |__| |\/| |___ [__ |___ |__/ | | |___ |__/
|__] | | | | |___ ___] |___ | \ \/ |___ | \
|====================================================|
| [ResourceMgr]----------{ConfigFiles} |
| | ^-------------------------------+ |
|========| |---+----| ^ |----+-----|---->|-----+----|
| Client |--[Mpack]--+ NetMgr |<--[Mpack]---->| StateMgr | | LogicMgr |
|========| |-- + ---| |--- + ----|<----|----------|
| | | |
| [LoginSrv]------------------┤ |
|============================ | =====================|
|
[UDPServer]
|
|=== + ====|
| DBGate +---[MySQL Server]
|==========|
拥有dbgate
与gameserver
两个进程,前者作为数据库中间件对数据库进行操作,后者作为服务器主进程完成运行逻辑等任务。
使用以boost.asio
的io_service
为基础的所有模块共享的线程池,除初始化外均使用异步io,使用strand
处理相关同步问题。
- NetMgr(
NetworkManager
)完成网络相关io任务并维护链接状态,外部使用TCP长连接,内部使用UDP收发消息 - StateMgr(
StateManager
)完成游戏世界和玩家相关状态的更新、查询,并定期提交数据修改至dbgate
- LoginSrv处理登录/注册/账号管理等相关服务, 现未实装, 职能由NetMgr中相关函数实现,使用
pugixml
实现 - ResourceMgr处理配置文件加载管理,更新等任务, 现未实装, 职能由各各模块自行处理
- LogicMgr处理游戏世界相关业务逻辑,预计使用嵌入脚本语言方式实现,未实装
UDPServer
完成内部消息包(Mpack
)的解析MDBManager
完成数据库相关业务
使用统一的protobuf包(Mpack
)传递消息,相关定义参看proto/mpack.proto
。内部使用CONTROL
类别进行标记。
游戏相关数据分为Player
与World
两部份,目前两者均实现为以无符号整数为键,字符串或无符号整数为值的字典。
分为处理外部消息的TCP部分和内部控制消息的UDP部分,
为TCPServer
-NetworkSession
-NetworkConnection
三层结构:
TCPServer
接受TCP链接请求,并创建NetworkSession
,并提供相关接口(deliver
)用于发送消息至对应链接。NetworkSession
维护会话状态(登录等),并解析相关请求,提交作业(Mpack
形式)至相关模块(StateMgr等)NetworkConnection
对Mpack
进行打包传输等底层任务
- 使用协程方式编程,建立临时端口与
dbgate
进行通讯,完成数据收发、同步、登录验证等任务 - 维护
dbgate
地址等内部信息
对外提供添加工作的接口(addTask
),内部使用回调函数循环不断完成相关工作。
内存中数据分为Players
与World
两部分,前者为以uid
为键,Mpack
定义的数据结构为值的数据结构,后者直接使用Mpack
中相关定义。
- 相关修改发生时会进行相关记录用于同步,以此来持久化数据。
- 现每30s会定时同步一次
- 直到收到
dbgate
相关的确认后才刷新同步信息
使用mysql++
实现,使用智能指针实现链接池对链接进行管理。
现支持简单的自动轮替、分层次输出等,切分、自动删除等尚未实装
./dbgate -> dbgate启动
./gameserver -> gameserver启动
|
|
|----> 请求最新`World`数据--->dbgate
| |
|<----返回相关数据----------------
|
挂载(Mount)World数据至StateManager
|
监听TCP链接请求
Client--发起链接-----|
| |
|----登录请求-->处理登录请求
| |----> 发送登录验证请求---->dbgate
| | |
| |<----返回相关数据--------------
| 验证成功
| |----> 请求最新用户数据---->dbgate
| | |
| |<----返回相关数据--------------
| 挂载(Mount)Player数据至StateManager
| |
|<-------返回成功信息,修改会话状态
|----数据请求-->处理数据请求
| |
...................
...................
| |
|<------------返回数据包
| |----> 定时同步修改数据---->dbgate
| | |
| |<----返回确认-----------------
| 刷新同步信息
| |
断开链接------ >确认链接断开,卸载用户数据
|
|
|
...