目录

通讯协议格式

作为一款服务器引擎,通讯协议的格式是必须要了解的。本文将介绍引擎所使用的通讯协议格式。

概述:

客户端想要与CBEngine进行通讯则需要与CBEngine使用相同的协议,否则将出现通讯异常、消息解析错误等失败。CBEngine通讯协议分为如下两种类型:

  • 确定长度类型;
  • 不固定长度类型

包结构介绍:

使用2个Bytes描述消息ID,如果是确定长度的消息,则没有消息长度的描述,否则使用2Bytes进行消息长度的的描述。最后是消息体,使用二进制流的方式存入,长度根据内容而定。

确定长度类型:

         |-----------------------------------------------------------------|
Packet = |      Len: 2Bytes            |            Len: N                 |
         |     (Message-ID: uint16)    |   (Message-Body: Binary-stream)   |
         |-----------------------------------------------------------------|

所谓确定长度,就是知道该消息的长度,并且固定的。在发送和接收的解析时,不需要知道消息的长度。这样的好处时,减少包体的大小(因为少了描述消息长度的块)。

我们来举个例子:

void client_funcXX(UInt8 p1, Int64 p2)
 ...
 ...

void server_funcXXX()
    packet.newMessage(ClientInterface::client_funcXX);
    packet.writeUInt8(1);
    packet.writeInt64(1);

         |--------------------------------------------------------------------------------|
Packet = |      Len: 2Bytes                                |            Len: 1, 8         |
         |     (Message-ID(client_funcXX): uint16)         |       (Message-Body: p1, p2) |
         |--------------------------------------------------------------------------------|

不固定长度类型:

         |--------------------------------------------------------------------------------------------|
Packet = |      Len: 2Bytes            |       Len: 2Bytes          |           Len: N                |
         |     (Message-ID: uint16)    |   (Message-Length: uint16) |   (Message-Body: Binary-stream) |
         |--------------------------------------------------------------------------------------------|

所谓不固定长度,就是不知道该消息的具体长度,如消息中包含字符串。需要在包中指定消息的长度才可以被正确解析。在上面的图中,我们可以看到使用2个Bytes来指定消息的长度。

我们来举个例子:

void client_funcXX(uint8 p1, int64 p2, string p3)
...
...

void server_funcXXX()
    packet.newMessage(ClientInterface::client_funcXX);
    packet.writeUint8(1);
    packet.writeInt64(1);
    packet.writeString("123456");

         |--------------------------------------------------------------------------------------------|
Packet = |      Len: 2Bytes            |       Len: 2Bytes          |           Len: 1, 8, 7          |
         |     (Message-ID: uint16)    |   (Message-Length: uint16) |   (Message-Body: p1, p2, p3)    |
         |--------------------------------------------------------------------------------------------|

注意:

1、如果消息长度超过65534,Message-Length固定被填充为65535,协议层会在Message-Length区段之后再额外增加4字节,来描述更大的长度信息。

2、测试协议请关闭数据包加密, 可至{项目资产库}/res/server/kbengine.xml中修改字段channelCommon->encrypt_type。详情见《引擎配置之kbengine.xml》一文。


Copyright © 2018 Yolo Technologies. Publication: 2.0-025. Built: 2018-12-07.