Part 6.0 数据包基础
本章你将学到:
- 什么是数据包
- 数据包的结构
同步
- 同步指客户端、服务器通过数据包来将游戏状态发送给彼此,以达到两端游戏数据相同的过程。 举个例子:假如A玩家在游戏中生成了一个弹幕,那么A玩家就会向服务器发送一个数据包,告诉服务器他在游戏里生成了一个新的弹幕,服务器会将这个弹幕储存起来,然后发送数据包给其他玩家,告知A玩家生成了一个新的弹幕。
这个过程就是同步。 - 在上面的例子中,A玩家首先发送数据包和服务器同步,服务器再发送数据包和其他玩家同步,这样以来服务器、所有的客户端的对应的弹幕均相同,保证游戏里每一个玩家都能在相同的位置看见这个弹幕。
数据包
数据包是一种数据结构,就好比服主们喜欢用的JSON数据结构一样。数据包精简,体积小,适合传输;JSON体积更大,但更适合人阅读。 举个例子:TileGetSection(客户端请求获取区块) [8] 这个数据包用JSON表示如下
{
"Type": 8 //byte
"TileX": 114, //int
"TileY": 514, //int
}他的数据包形式对应[9,0,8,114,0,0,0,2,2,0,0](byte[]),这是每个数字对应的含义
| 偏移量(Offset) | 大小(Size) | 字段 | 值(十进制) | 值(十六进制) | 说明 |
|---|---|---|---|---|---|
| 0 | 2 | Packet Length | 9 ([9,0]) | 0x0009 | 数据包总长度 = 9 字节 |
| 2 | 1 | Packet Type | 8 | 0x08 | 数据包类型(8号数据包表示客户端请求获取区块) |
| 3 | 4 | TileX | 114, 0, 0, 0 | 0x72 0x00 0x00 0x00 | int32大小为4字节,所以字段有4个 |
| 7 | 4 | TileY | 2, 2, 0, 0 | 0x02 0x02 0x00 0x00 | 同上 |
数据包的二进制格式不像 JSON 那样通过键(如 Type、TileX)标识字段,而是通过协议约定的字节偏移量(Offset)和字段长度(Size)来定位数据。
例如,要解析 TileX:
- 根据协议,
TileX的偏移量是3(从 0 开始计数)。 - 读取接下来的
4个字节(因为TileX是int32)。 - 按约定的字节序
Little Endian(小端序)解析为整数值。//你只要知道是Little Endian(小端序)就好了
注
在网络传输中,字节存储顺序有Little Endian(小端序)和Big Endian(大端序)之分,泰拉瑞亚的网络协议使用的是Little Endian(小端序)
