首页 > 编程语言 >Multiserver游戏服务器Demo[C++&Lua]

Multiserver游戏服务器Demo[C++&Lua]

时间:2023-05-29 17:34:07浏览次数:53  
标签:封装 Socket Service Demo Multiserver C++ 线程 消息

代码参考

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

关键特性

  • 对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 读写锁

标签:封装,Socket,Service,Demo,Multiserver,C++,线程,消息
From: https://www.cnblogs.com/hggzhang/p/17142444.html

相关文章

  • C/C++家谱管理系统[2023-05-29]
    C/C++家谱管理系统[2023-05-29]题目8:家谱管理系统(1~3人)[问题描述]实现具有下列功能的家谱管理系统1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2).......
  • Linux下C++实现一个定时器
    要在Linux下实现一个定时器,可以使用以下两种方法:使用系统提供的定时器APILinux系统提供了一些定时器API,如setitimer、timer_create、timer_gettime等,可以使用这些API来实现定时器。以setitimer为例,可以按照以下步骤来使用:1.定义一个itimerval结构体变量,该结构体包含定时器的初......
  • C和C++的性能调优工具
    以下是C和C++的性能调优工具,包含工具介绍和链接:Valgrind:一款非常流行的内存调试和性能分析工具,可以检测内存泄漏、死锁等问题,并提供CPU性能分析工具。它可以跟踪程序中的所有内存分配和释放操作,并在程序执行时给出详细的报告。Valgrind是一个开源工具,支持Linux和MacOS等操......
  • c++ 模版元编程-00
    本系列文章从零开始介绍C++模版元编程,需要有C++基础。函数模版template<typenameT>Tadd(Tconsta,Tconstb){returna+b;}autoa=add(42,21);autod=add<double>(41.0,21);//无法自动推导类型的时候可以显示的指定类型类模版template<typenameT>......
  • C++-条件变量/互斥锁/lock_guard
    条件变量参考C++Reference对于条件变量的解释和例程:https://en.cppreference.com/w/cpp/thread/condition_variable条件变量和互斥锁一般结合使用。因为线程处于等待状态中,一般需要查看一个全局变量或共享的变量的状态,来决定是否停止等待继续运行程序。对于此全局变量,必须要......
  • C++头文件理解
    看了下公司内部对于头文件的使用,感觉挺乱的。对于头文件容易搞混淆的点在于:涉及多文件,多次包含的时候容易搞错比如上面CPP就有三四个文件,每一个CPP都要按照先包含config,后包含common的顺序,在编译的时候指明。但是include头文件本质上就是:在编译时把指定的文件,包含到调用的地方......
  • 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
    文章首发【重学C++】05|说透右值引用、移动语义、完美转发(下)引言大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第五讲,在第四讲《【重学C++】04|说透右值引用、移动语义、完美转发(上)》中,我们解释了右值和右值引用的相关概念,并介绍了C++的移动语义以及如何通过右值引......
  • U3DFrameWorkDemo:四、资源打包和热更
    代码参考代码文件参考下述详解的类图,工程参考第零章工程说明概述热更新方便用户更新,增加用户的留存量。它依赖打包生成的版本文件。思路打包考虑分包策略,包体太大加载速度慢且可能有无效的内存冗余,包体太小可能会频繁加载AB造成效率下降。核心思想是把用到的东西放在一起,通......
  • U3DFrameWorkDemo:二、资源管理
    代码参考代码文件参考下述详解的类图,工程参考第零章工程说明概述在游戏项目中有很多资产如:预制体,图片,音频,Lua脚本,Shader等等。他们随打包放在用户的硬盘里。在游戏的运行过程中,需要对这些资产加载和卸载,资源管理模块负责做这些事情。思路U3D会托管资产,也就是说资产一旦被加......
  • U3DFrameWorkDemo:零、工程说明
    序言前段时间拾起U3D时,重新看了一下之前的学习资料,整理成了一个demo。主要包含框架基本模块核心功能实现。当然,这个小demo是我个人的学习和探索,如demo的中文解释,它是一个“原型”--既是它的优点,也是它的缺点。它并不是一个完整的框架,但包含其核心功能模块的实现思路,简单直接(应用......