经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
Multiserver游戏服务器Demo[C++&Lua]
来源:cnblogs  作者:寡人正在Coding  时间:2023/5/29 17:25:49  对本文有异议

代码参考

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

关键特性

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

详解

Socket库封装

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

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

服务器引擎

image

  • 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++方法

消息处理模型时序图

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

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

多服务

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

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

其他

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

原文链接:https://www.cnblogs.com/hggzhang/p/17142444.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号