【发布时间】:2023-03-23 01:18:02
【问题描述】:
我在 Netty 项目中搜索了许多示例,它们看起来既简单又很棒。但是,解码器有一个共同点:它们首先读取一些标头,然后预先知道要读取多少字节。
我必须实现更复杂的协议。这是一个专有的二进制协议,结构如下:
+--------+-----------+------------+-------+------------+-------+-----------+
| header | msg_count | msg_type_1 | msg_1 | msg_type_n | msg_n | msg_count |
+--------+-----------+------------+-------+------------+-------+-----------+
11 bytes 1 byte 1 byte bytes 1 byte bytes 1 byte
标题包含序列号。然后是消息计数和 n 条消息。这些消息的长度各不相同。在传输结束时,消息计数再次被重新计算,这是传输完成的标志。
消息可以有不同的类型。有些类型是固定宽度,但有些类型会有所不同,例如。 g.:
- msg 类型 0x01:固定宽度为 4 个字节
- 消息类型 0x02:第一个字节 - 消息长度为 m,然后是 m 个字节
我不知道如何为此类协议实现 Netty 解码器。这里的主要问题是,在我真正解析整个缓冲区之前,没有明确的结束迹象 - 消息被很好地解析并且消息计数在最后被重新计算。
Netty 中有什么机制可以帮助我解决这个问题吗?
【问题讨论】:
-
如何知道消息何时结束,新消息何时开始?
-
@jtahlborn 在最后重新调用 msg_count 后,可能会立即收到另一个标题。没有分隔符。
-
不,你怎么知道msg_1和msg_type_n的界限?
-
@jtahlborn 我改进了帖子的消息类型和长度
标签: java sockets protocols netty