【问题标题】:How to decode buffer in Netty with unknown length?如何在 Netty 中解码长度未知的缓冲区?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2012-03-27
    • 2014-07-08
    相关资源
    最近更新 更多