如何在 Netty 中解码长度未知的缓冲区



我在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 条消息。这些消息的长度各不相同。在传输结束时,会再次重复消息计数,这是传输完成的标志。

消息可以有不同的类型。有些类型是固定宽度,但有些类型会有所不同,例如:

  • 消息类型 0x01:固定宽度为 4 字节
  • msg 类型 0x02:第一个字节 - 消息长度为 m 个,然后是 m 个字节

我不知道如何为此类协议实现Netty解码器。这里的主要问题是,在我实际解析整个缓冲区之前,没有明确的结束迹象 - 消息解析良好,消息计数在最后重新练习。

Netty中是否有任何机制可以帮助我解决此案?

至少,你应该能够实现重播解码器。 也许不是最有效的实现,但可能是最简单的。