Netty 如何解决粘包拆包?
Netty 面试题发布于
一、问题
TCP 是字节流,没有消息边界,多个请求可能粘在一起(粘包),一个请求可能被拆分(拆包)。
二、解决方案
- 固定长度:FixedLengthFrameDecoder,每条消息固定长度。
- 特殊分隔符:DelimiterBasedFrameDecoder,按换行符等分隔。
- 长度字段:LengthFieldBasedFrameDecoder,消息头带长度字段,最常用。
- 自定义协议:魔数 + 长度 + 序列号 + 数据体。
三、LengthFieldBasedFrameDecoder
new LengthFieldBasedFrameDecoder(
maxFrameLength, // 最大帧长度
lengthFieldOffset, // 长度字段偏移
lengthFieldLength, // 长度字段长度
lengthAdjustment, // 长度调整
initialBytesToStrip // 跳过的字节数
);
四、自定义协议示例
+--------+--------+----------+--------+
| 魔数 | 长度 | 序列号 | 数据 |
| 4 byte | 4 byte | 4 byte | N byte |
+--------+--------+----------+--------+
五、注意
解码器放在 Pipeline 最前面,业务 Handler 在后面。