如何解码长度未知的 Netty 缓冲区?
How to decode buffer in Netty with unknown length?
我在 Netty 项目中搜索了很多示例,它们看起来很简单而且很棒。然而,解码器有一个共同点:他们先读取一些 header 然后他们提前知道要读取多少字节。
我必须实施更复杂的协议。这是一个专有的二进制协议,构造如下:
+--------+-----------+------------+-------+------------+-------+-----------+
| 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
Header 包含序列号。然后是消息计数和 n 条消息。这些消息的长度各不相同。在传输结束时,消息计数再次重复,这是传输完成的标志。
消息可以有不同的类型。有些类型是固定宽度的,但有些类型会变化,例如。 g.:
- 消息类型 0x01:固定宽度 4 个字节
- 消息类型 0x02:第一个字节 - 消息长度为 m,然后是 m 字节
我不知道如何为这种协议实现 Netty 解码器。这里的主要问题是,在我实际解析整个缓冲区之前,没有明确的结束标志——消息被解析得很好,消息计数在最后重新计算。
Netty有什么机制可以帮我解决这个问题吗?
最起码,你应该能够实现一个ReplayingDecoder。也许不是最有效的实现,但可能是最简单的。
我在 Netty 项目中搜索了很多示例,它们看起来很简单而且很棒。然而,解码器有一个共同点:他们先读取一些 header 然后他们提前知道要读取多少字节。
我必须实施更复杂的协议。这是一个专有的二进制协议,构造如下:
+--------+-----------+------------+-------+------------+-------+-----------+
| 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
Header 包含序列号。然后是消息计数和 n 条消息。这些消息的长度各不相同。在传输结束时,消息计数再次重复,这是传输完成的标志。
消息可以有不同的类型。有些类型是固定宽度的,但有些类型会变化,例如。 g.:
- 消息类型 0x01:固定宽度 4 个字节
- 消息类型 0x02:第一个字节 - 消息长度为 m,然后是 m 字节
我不知道如何为这种协议实现 Netty 解码器。这里的主要问题是,在我实际解析整个缓冲区之前,没有明确的结束标志——消息被解析得很好,消息计数在最后重新计算。
Netty有什么机制可以帮我解决这个问题吗?
最起码,你应该能够实现一个ReplayingDecoder。也许不是最有效的实现,但可能是最简单的。