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

时间:2016-03-21 22:53:00

标签: java sockets protocols 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条消息。这些消息的长度各不相同。在传输结束时,消息计数再次被重新编译,并且它是已完成传输的标志。

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

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

我不知道如何为这种协议实现Netty解码器。这里的主要问题是在我实际解析整个缓冲区之前没有明确的结束迹象 - 消息被解析得很好并且消息计数在最后被重新编译。

Netty中是否有任何机制可以帮我解决这个问题?

1 个答案:

答案 0 :(得分:1)

至少,您应该能够实施ReplayingDecoder。也许不是最有效的实现,但可能是最简单的。