加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

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

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

有了 Server 类型,肯定也需要有 Client 类型。而 Client 类型的设计和 Server 类似,但就不是使用 Transport 接口作为传输层,而是 Connector 接口。不过 Protocol 的抽象层是完全重用的。Client 并不需要 Processor 这种形式的回调,而是直接传入接受数据消息就发起回调的接口对象 ClientCallback。

  1. class ClientCallback { 
  2.  
  3. public: 
  4.    
  5.     ClientCallback() { 
  6.     } 
  7.     virtual ~ClientCallback() { 
  8.          // Do nothing 
  9.     } 
  10.  
  11.     /** 
  12.      *  当连接建立成功时回调此方法。 
  13.      * @return 返回 -1 表示不接受这个连接,需要关闭掉此连接。 
  14.      */ 
  15.     virtual int OnConnected() { 
  16.         return 0; 
  17.     } 
  18.  
  19.     /** 
  20.      * 当网络连接被关闭的时候,调用此方法 
  21.      */ 
  22.     virtual void OnDisconnected() {        // Do nothing 
  23.     } 
  24.  
  25.     /** 
  26.      * 收到响应,或者请求超时,此方法会被调用。 
  27.      * @param response 从服务器发来的回应 
  28.      * @return 如果返回非0值,服务器会打印一行错误日志。 
  29.      */ 
  30.     virtual int Callback(const Response& response) { 
  31.         return 0; 
  32.     } 
  33.  
  34.     /** 
  35.      * 当请求发生错误,比如超时的时候,返回这个错误 
  36.      * @param err_code 错误码 
  37.      */ 
  38.     virtual void OnError(int err_code){ 
  39.         WARN_LOG("The request is timeout, err_code: %d", err_code); 
  40.     } 
  41.  
  42.     /** 
  43.      * 收到通知消息时,此方法会被调用 
  44.      */ 
  45.     virtual int Callback(const Notice& notice) { 
  46.         return 0; 
  47.     } 
  48.  
  49.     /** 
  50.      * 返回此对象是否应该被删除。此方法会被在 Callback() 调用前调用。 
  51.      * @return 如果返回 true,则会调用 delete 此对象的指针。 
  52.      */ 
  53.     virtual bool ShouldBeRemoved() { 
  54.         return false; 
  55.     } 
  56. }; 
  57.  
  58. class Client : public Updateable { 
  59.   
  60. public: 
  61.     Client();    virtual ~Client(); 
  62.  
  63.      /** 
  64.      * 连接服务器 
  65.      * @param connector 传输协议,如 TCP, UDP ... 
  66.      * @param protocol 分包协议,如 TLV, Line, TDR ... 
  67.      * @param notice_callback 收到通知后触发的回调对象,如果传输协议有“连接概念”(如TCP/TCONND),建立、关闭连接时也会调用。 
  68.      * @param config 配置文件对象,将读取以下配置项目:MAX_TRANSACTIONS_OF_CLIENT 客户端最大并发连接数; BUFFER_LENGTH_OF_CLIENT客户端收包缓存;CLIENT_RESPONSE_TIMEOUT 客户端响应等待超时时间。 
  69.      * @return 返回 0 表示成功,其他表示失败 
  70.      */ 
  71.     int Init(Connector* connector, Protocol* protocol, 
  72.              ClientCallback* notice_callback = NULL, Config* config = NULL); 
  73.  
  74.     /** 
  75.      * callback 参数可以为 NULL,表示不需要回应,只是单纯的发包即可。 
  76.      */ 
  77.     virtual int SendRequest(Request* request, ClientCallback* callback = NULL); 
  78.  
  79.     /** 
  80.      * 返回值表示有多少数据需要处理,返回-1为出错,需要关闭连接。返回0表示没有数据需要处理。 
  81.      */ 
  82.     virtual int Update(); 
  83.     virtual void OnExit(); 
  84.     void Close(); 
  85.     Connector* connector() ; 
  86.     ClientCallback* notice_callback() ; 
  87.     Protocol* protocol() ; 
  88. }; 

至此,客户端和服务器端基本设计完成,可以直接通过编写测试代码,来检查是否运行正常。

关于作者:韩伟,腾讯互娱高级工程师,目前在Next产品中心研发创新类型游戏。

(编辑:应用网_丽江站长网)

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

热点阅读