对付通讯“协议”来说,着实包括了许很多多的寄义。在浩瀚的需求中,我所界说的这个协议层,只但愿完成四个最根基的手段:
- 分包:从流式传输层切分出一个个单独的数据单位,可能把多个“碎片”数据拼合成一个完备的数据单位的手段。一样平常办理这个题目,必要在协议头部添加一个“长度”字段。
- 哀求相应对应:这对付异步非阻塞的通讯模式下,长短常重要的成果。由于也许在一刹时发出了许多个哀求,而回应则会不分先后的达到。协议头部假若有一个不一再的“序列号”字段,就可以对应起哪个回应是属于哪个哀求的。
- 会话保持:因为游戏的底层收集,也许会行使 UDP 可能 HTTP 这种非长毗连的传输方法,以是要在逻辑上保持一个会话,就不能纯真的依赖传输层。加上我们都但愿措施有抗收集发抖、断线重连的手段,以是保持会话成为一个常见的需求。我参考在 Web 处事规模的会话成果,计划了一个 Session 成果,在协议中加上 Session ID 这样的数据,就能较量简朴的保持会话。
- 分发:游戏处事器一定会包括多个差异的营业逻辑,因此必要多种差异数据名目标协议包,为了把对应名目标数据转发。
除了以上三个成果,现实上但愿在协议层处理赏罚的手段,尚有许多,最典范的就是工具序列化的成果,尚有压缩、加密成果等等。我之以是没有把工具序列化的手段放在 Protocol 中,缘故起因是工具序列化中的“工具”自己是一个营业逻辑关联性很是强的观念。在 C++ 中,并没有完备的“工具”模子,也缺乏原生的反射支持,以是无法很简朴的把代码条理通过“工具”这个抽象观念分别隔来。可是我也计划了一个 ObjectProcessor ,把工具序列化的支持,以更上层的情势团结到框架中。这个 Processor 是可以自界说工具序列化的要领,这样开拓者就可以本身选择任何“编码、解码”的手段,而不必要依赖底层的支持。
至于压缩和加密这一类成果,确实是可以放在 Protocol 层中实现,乃至可以作为一个抽象条理插手 Protocol ,也许只有一个 Protocol 层不敷以支持这么富厚的成果,必要仿佛 Apache Mina 这样,计一律个“挪用链”的模子。可是为了简朴起见,我认为在详细必要用到的处所,再特殊添加 Protocol 的实现类就好,好比添加一个“带压缩成果的 TLV Protocol 范例”之类的。
动静自己被抽象成一个叫 Message 的范例,它拥有“处事名字”“会话ID”两个动静头字段,用以完成“分发”和“会话保持”成果。而动静体则被放在一个字节数组中,并记录下字节数组的长度。
- enum MessageType {
- TypeError, ///< 错误的协议
- TypeRequest, ///< 哀求范例,从客户端发往处事器
- TypeResponse, ///< 相应范例,处事器收到哀求后返回
- TypeNotice ///< 关照范例,处事器主动关照客户端
- };
-
- ///@brief 通讯动静体的基类
- ///根基上是一个 char[] 缓冲区
- struct Message {
- public:
- static int MAX_MAESSAGE_LENGTH;
- static int MAX_HEADER_LENGTH;
-
- MessageType type; ///< 此动静体的范例(MessageType)信息
-
- virtual ~Message(); virtual Message& operator=(const Message& right);
-
- /**
- * @brief 把数据拷贝进此包体缓冲区
- */
- void SetData(const char* input_ptr, int input_length);
-
- ///@brief 得到数据指针
- inline char* GetData() const{
- return data_;
- }
-
- ///@brief 得到数据长度
- inline int GetDataLen() const{
- return data_len_;
- }
-
- char* GetHeader() const;
- int GetHeaderLen() const;
-
- protected:
- Message();
- Message(const Message& message);
-
- private:
- char* data_; // 包体内容缓冲区
- int data_len_; // 包体长度
-
- };
按照之前计划的“哀求相应”和“关照”两种通讯模式,必要计划出三种动静范例担任于 Message,他们是:Request(哀求包)、Response(相应包)、Notice(关照包)。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|