是否需要在Netty的ZlibDecoders中使用诸如LengthFieldBasedFrameDecoder
之类的定界符?我遇到一个问题,即解码器有时会因“未知的压缩方法”而出错,当我修改管道以分隔数据时,这种情况就消失了。 Zlib编码器/解码器的Javadocs并没有按要求提及,尽管它们的超类确实如此。
最佳答案
这取决于传输协议以及如何将压缩应用于消息/帧,
如果仅对内容部分应用压缩,如下面的内容(如http),则不需要LengthFieldBasedFrameDecoder,因为解码器/编码器必须在内部使用带有ZlibDecoder / ZlibEncoder的DecoderEmbedder / EncoderEmbedder。
+-----+---------------+
| | |
| HDR | Content |
| | |
+-----+---------------+
如果将压缩应用于整个帧,并且传输协议为TCP,则压缩帧应具有标头参数以标识消息长度以完全读取它。因此,您将在管道中使用LengthFieldBasedFrameDecoder和LengthFieldPrepender
+---------------------+ +------+-------------+
| | | | |
| Frame | <=> |Length| Zipped Frame|
| | | | |
+---------------------+ +------+-------------+