LengthFieldBasedFrameDecoder

LengthFieldBasedFrameDecoder

是否需要在Netty的ZlibDecoders中使用诸如LengthFieldBasedFrameDecoder之类的定界符?我遇到一个问题,即解码器有时会因“未知的压缩方法”而出错,当我修改管道以分隔数据时,这种情况就消失了。 Zlib编码器/解码器的Javadocs并没有按要求提及,尽管它们的超类确实如此。

最佳答案

这取决于传输协议以及如何将压缩应用于消息/帧,


如果仅对内容部分应用压缩,如下面的内容(如http),则不需要LengthFieldBasedFrameDecoder,因为解码器/编码器必须在内部使用带有ZlibDecoder / ZlibEncoder的DecoderEmbedder / EncoderEmbedder。

  +-----+---------------+
  |     |               |
  | HDR |  Content      |
  |     |               |
  +-----+---------------+

如果将压缩应用于整个帧,并且传输协议为TCP,则压缩帧应具有标头参数以标识消息长度以完全读取它。因此,您将在管道中使用LengthFieldBasedFrameDecoder和LengthFieldPrepender

  +---------------------+       +------+-------------+
  |                     |       |      |             |
  |      Frame          | <=>   |Length| Zipped Frame|
  |                     |       |      |             |
  +---------------------+       +------+-------------+

07-27 21:58