📠 通讯协议格式
大约 2 分钟
通讯协议格式
作为一款服务器引擎,通讯协议的格式是必须要了解的。本文将介绍引擎所使用的通讯协议格式。
概述
客户端想要与KBEngine进行通讯则需要与KBEngine使用相同的协议,否则将出现通讯异常、消息解析错误等失败。KBEngine通讯协议分为如下两种类型:
- 确定长度类型;
- 不固定长度类型
包结构介绍
使用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》一文。