加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

教你从头写游戏服务器框架

发布时间:2019-02-20 22:44:34 所属栏目:外闻 来源:腾讯游戏学院
导读:1.需求 由于越通用的代码,就是越没用的代码,所以在设计之初,我就认为应该使用分层的模式来构建整个系统。按照游戏服务器的一般需求划分,最基本的可以分为两层: 底层基础功能:包括通信、持久化等非常通用的部分,关注的是性能、易用性、扩展性等指标

对于 Protocol 的具体实现子类,我首先实现了一个 LineProtocol ,是一个非常不严谨的,基于文本ASCII编码的,用空格分隔字段,用回车分包的协议。用来测试这个框架是否可行。因为这样可以直接通过 telnet 工具,来测试协议的编解码。然后我按照 TLV (Type Length Value)的方法设计了一个二进制的协议。大概的定义如下:

协议分包: [消息类型:int:2] [消息长度:int:4] [消息内容:bytes:消息长度]

消息类型取值:

  • 0x00 Error
  • 0x01 Request
  • 0x02 Response
  • 0x03 Notice

Processor

处理器层是我设计用来对接具体业务逻辑的抽象层,它主要通过输入参数 Request 和 Peer 来获得客户端的输入数据,然后通过 Server 类的 Reply()/Inform() 来返回 Response 和 Notice 消息。实际上 Transport 和 Protocol 的子类们,都属于 net 模块,而各种 Processor 和 Server/Client 这些功能类型,属于另外一个 processor 模块。这样设计的原因,是希望所有 processor 模块的代码单向的依赖 net 模块的代码,但反过来不成立。

Processor 基类非常简单,就是一个处理函数回调函数入口 Process():

  1. ///@brief 处理器基类,提供业务逻辑回调接口 
  2.  
  3. class Processor { 
  4.  
  5. public: 
  6.     Processor(); 
  7.     virtual ~Processor(); 
  8.   
  9.     /** 
  10.      * 初始化一个处理器,参数server为业务逻辑提供了基本的能力接口。 
  11.      */ 
  12.     virtual int Init(Server* server, Config* config = NULL); 
  13.  
  14.     /** 
  15.      * 处理请求-响应类型包实现此方法,返回值是0表示成功,否则会被记录在错误日志中。 
  16.      * 参数peer表示发来请求的对端情况。其中 Server 对象的指针,可以用来调用 Reply(), 
  17.      * Inform() 等方法。如果是监听多个服务器,server 参数则会是不同的对象。 
  18.      */ 
  19.     virtual int Process(const Request& request, const Peer& peer, 
  20.                         Server* server); 
  21.  
  22.     /** 
  23.      * 关闭清理处理器所占用的资源 
  24.      */ 
  25.     virtual int Close(); 
  26. }; 

(编辑:晋中站长网)

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

热点阅读