加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

教你从新写游戏处事器框架

发布时间:2019-02-21 01:04:05 所属栏目:业界 来源:腾讯游戏学院
导读:1.需求 因为越通用的代码,就是越没用的代码,以是在计划之初,我就以为应该行使分层的模式来构建整个体系。凭证游戏处事器的一样平常需求分别,最根基的可以分为两层: 底层基本成果:包罗通讯、耐久化等很是通用的部门,存眷的是机能、易用性、扩展性等指标

计划完 Transport/Protocol/Processor 三个通讯处理赏罚条理后,就必要一个组合这三个条理的代码,那就是 Server 类。这个类在 Init() 的时辰,必要上面三个范例的子类作为参数,以组合成差异成果的处事器,如:

  1. TlvProtocol tlv_protocol;   //  Type Length Value 名目分包协议,必要和客户端同等 
  2. TcpTransport tcp_transport; // 行使 TCP 的通讯协议,默认监听 0.0.0.0:6666 
  3. EchoProcessor echo_processor;   // 营业逻辑处理赏罚器 
  4. Server server;  // DenOS 的收集处事器主工具 
  5. server.Init(&tcp_transport, &tlv_protocol, &echo_processor);    // 组装一个游戏处事器工具:TLV 编码、TCP 通讯和覆信处事 

Server 范例还必要一个 Update() 函数,让用户历程的“主轮回”不断的挪用,用来驱动整个措施的运行。这个 Update() 函数的内容很是明晰:

  1. 搜查收集是否稀有据必要处理赏罚(通过 Transport 工具)
  2. 稀有据的话就举办解码处理赏罚(通过 Protocol 工具)
  3. 解码乐成后举办营业逻辑的分发挪用(通过 Processor 工具)

其它,Server 还必要处理赏罚一些特另外成果,好比维护一个会话缓存池(Session),提供发送 Response 和 Notice 动静的接口。当这些事变都完成后,整套体系已经可以用来作为一个较量“通用”的收集动静处事器框架存在了。剩下的就是添加各类 Transport/Protocol/Processor 子类的事变。

  1. class Server { 
  2.  
  3. public: 
  4.     Server(); 
  5.     virtual ~Server(); 
  6.   
  7.     /** 
  8.      * 初始化处事器,必要选择组装你的通讯协议链 
  9.      */ 
  10.     int Init(Transport* transport, Protocol* protocol, Processor* processor, Config* config = NULL); 
  11.  
  12.     /** 
  13.      * 阻塞要领,进入主轮回。 
  14.      */ 
  15.     void Start(); 
  16.  
  17.     /** 
  18.      * 必要轮回挪用驱动的要领。假如返回值是0暗示空闲。其他返回值暗示处理赏罚过的使命数。 
  19.      */ 
  20.     virtual int Update(); 
  21.     void ClosePeer(Peer* peer, bool is_clear = false); //封锁当个毗连,is_clear 暗示是否最终整体整理 
  22.  
  23.     /** 
  24.      * 封锁处事器 
  25.      */ 
  26.     void Close(); 
  27.  
  28.     /** 
  29.      * 对某个客户端发送关照动静, 
  30.      * 参数peer代表要关照的对端。 
  31.      */ 
  32.     int Inform(const Notice& notice, const Peer& peer); 
  33.  
  34.     /** 
  35.      * 对某个  Session ID 对应的客户端发送关照动静,返回 0 暗示可以发送,其他值为发送失败。 
  36.      * 此接口能支持断线重连,只要客户端已经乐成毗连,并行使旧的 Session ID,同样有用。 
  37.      */ 
  38.     int Inform(const Notice& notice, const std::string& session_id); 
  39.  
  40.     /** 
  41.      * 对某个客户端发来的Request发回回应动静。 
  42.      * 参数response的成员seqid必需正确填写,才气正确回应。 
  43.      * 返回0乐成,其余值(-1)暗示失败。 
  44.      */ 
  45.     int Reply(Response* response, const Peer& peer); 
  46.  
  47.     /** 
  48.      * 对某个 Session ID 对应的客户端发送回应动静。 
  49.      * 参数 response 的 seqid 成员体系会自动填写会话中记录的数值。 
  50.      * 此接口能支持断线重连,只要客户端已经乐成毗连,并行使旧的 Session ID,同样有用。 
  51.      * 返回0乐成,其余值(-1)暗示失败。 
  52.      */ 
  53.     int Reply(Response* response, const std::string& session_id); 
  54.  
  55.     /** 
  56.      * 会话成果 
  57.      */ 
  58.     Session* GetSession(const std::string& session_id = "", bool use_this_id = false); 
  59.     Session* GetSessionByNumId(int session_id = 0); 
  60.     bool IsExist(const std::string& session_id); 
  61.     
  62. }; 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读