前言
上一篇讲解如何将服务端中代码解析到具体的类中,这篇主要来讲解如何将一个包的数据,按照协议的要求发出。
如服务端需要接受Client的一个Auth,格式要求如下:
Produce Auth Packet
具体步骤是先生存AuthPacket,然后将对应的数据附上。然后调用auth.write(buffer)
,将数据写入到buffer中。
再调用buffer.get(bytes, 0, bytes.length)
把buffer转为二进制数据返回bytes,然后利用socket编程将bytes传给Server端。这里主要针对auth.write(buffer)
进行说明,具体的完整代码可以在我的github
上找到。
1 | /** |
这里讲一些特殊字段的write,如长度为4字节的clientFlags
。
1 | //如果是存入四个字节,其实是不能使用int的,因为24-32位是有符号位的,所以这里需要使用Long,这样可以保证前32表示的都是值 |
还有数据后跟着null的字段,如username
。
1 | public static final void writeWithNull(ByteBuffer buffer, byte[] src) { |
还有在插入数据前,写入长度的数据,如password
。因为表示长度的数据是一个LengthEncodedInteger
,所以根据长度的大小,先要插入一个标志符,具体如下:
最小值(包含) | 最大值(不包含) | 存储方式 |
---|---|---|
0 | 251 | 1个字节 |
251 | 2^16 | 3个字节(0xFC + 2个字节具体数据) |
2^16 | 2^24 | 4个字节(0xFD + 3个字节具体数据) |
2^24 | 2^64 | 9个字节(0xFE + 8个字节具体数据) |
1 | public static final void writeWithLength(ByteBuffer buffer, byte[] src) { |