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

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

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

Request 和 Response 两个类,都有记录序列号的 seq_id 字段,但 Notice 没有。Protocol 类就是认真把一段 buffer 字节数组,转换成 Message 的子类工具。以是必要针对三种 Message 的子范例都实现对应的 Encode() / Decode() 要领。

  1. class Protocol { 
  2.  
  3. public: 
  4.     virtual ~Protocol() { 
  5.     } 
  6.  
  7.     /** 
  8.      * @brief 把哀求动静编码成二进制数据 
  9.      * 编码,把msg编码到buf内里,返回写入了多长的数据,假如高出了 len,则返回-1暗示错误。 
  10.      * 假如返回 0 ,暗示不必要编码,框架会直接从 msg 的缓冲区读取数据发送。 
  11.      * @param buf 方针数据缓冲区 
  12.      * @param offset 方针偏移量 
  13.      * @param len 方针数据长度 
  14.      * @param msg 输入动静工具 
  15.      * @return 编码完成所用的字节数,假如 < 0 暗示堕落 
  16.      */ 
  17.     virtual int Encode(char* buf, int offset, int len, const Request& msg) = 0; 
  18.  
  19.     /** 
  20.      * 编码,把msg编码到buf内里,返回写入了多长的数据,假如高出了 len,则返回-1暗示错误。 
  21.      * 假如返回 0 ,暗示不必要编码,框架会直接从 msg 的缓冲区读取数据发送。 
  22.      * @param buf 方针数据缓冲区 
  23.      * @param offset 方针偏移量 
  24.      * @param len 方针数据长度 
  25.      * @param msg 输入动静工具 
  26.      * @return 编码完成所用的字节数,假如 < 0 暗示堕落 
  27.      */ 
  28.     virtual int Encode(char* buf, int offset, int len, const Response& msg) = 0; 
  29.  
  30.     /** 
  31.      * 编码,把msg编码到buf内里,返回写入了多长的数据,假如高出了 len,则返回-1暗示错误。 
  32.      * 假如返回 0 ,暗示不必要编码,框架会直接从 msg 的缓冲区读取数据发送。 
  33.      * @param buf 方针数据缓冲区 
  34.      * @param offset 方针偏移量 
  35.      * @param len 方针数据长度 
  36.      * @param msg 输入动静工具 
  37.      * @return 编码完成所用的字节数,假如 < 0 暗示堕落 
  38.      */ 
  39.     virtual int Encode(char* buf, int offset, int len, const Notice& msg) = 0; 
  40.  
  41.     /** 
  42.      * 开始编码,会返回即将解码出来的动静范例,以便行使者结构吻合的工具。 
  43.      * 现实操纵是在举办“分包”操纵。 
  44.      * @param buf 输入缓冲区 
  45.      * @param offset 输入偏移量 
  46.      * @param len 缓冲区长度 
  47.      * @param msg_type 输出参数,暗示下一个动静的范例,只在返回值 > 0 的环境下有用,不然都是 TypeError 
  48.      * @return 假如返回0暗示分包未完成,必要继承分包。假如返回-1暗示协议包头理会堕落。其他返回值暗示这个动静包占用的长度。 
  49.      */ 
  50.     virtual int DecodeBegin(const char* buf, int offset, int len, 
  51.                             MessageType* msg_type) = 0; 
  52.  
  53.     /** 
  54.      * 解码,把之前DecodeBegin()的buf数据解码成详细动静工具。 
  55.      * @param request 输出参数,解码工具会写入此指针 
  56.      * @return 返回0暗示乐成,-1暗示失败。 
  57.      */ 
  58.     virtual int Decode(Request* request) = 0; 
  59.  
  60.     /** 
  61.      * 解码,把之前DecodeBegin()的buf数据解码成详细动静工具。 
  62.      * @param request 输出参数,解码工具会写入此指针 
  63.      * @return 返回0暗示乐成,-1暗示失败。 
  64.      */ 
  65.     virtual int Decode(Response* response) = 0; 
  66.  
  67.     /** 
  68.      * 解码,把之前DecodeBegin()的buf数据解码成详细动静工具。 
  69.      * @param request 输出参数,解码工具会写入此指针 
  70.      * @return 返回0暗示乐成,-1暗示失败。 
  71.      */ 
  72.     virtual int Decode(Notice* notice) = 0;protected: 
  73.  
  74.     Protocol() { 
  75.     } 
  76.  
  77. }; 

这里有一点必要留意,因为 C++ 没有内存垃圾汇集和反射的手段,在表明数据的时辰,并不能一步就把一个 char[] 转换成某个子类工具,而必需分成两步处理赏罚。

先通过 DecodeBegin() 来返回,将要解码的数据是属于哪个子范例的。同时完因素包的事变,通过返回值来奉告挪用者,是否已经完备的收到一个包。

挪用对应范例为参数的 Decode() 来详细把数据写入对应的输出变量。

(编辑:湖南网)

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

热点阅读