Netty 如何解决粘包拆包?

Netty 面试题发布于

一、问题

TCP 是字节流,没有消息边界,多个请求可能粘在一起(粘包),一个请求可能被拆分(拆包)。

二、解决方案

  1. 固定长度:FixedLengthFrameDecoder,每条消息固定长度。
  2. 特殊分隔符:DelimiterBasedFrameDecoder,按换行符等分隔。
  3. 长度字段:LengthFieldBasedFrameDecoder,消息头带长度字段,最常用。
  4. 自定义协议:魔数 + 长度 + 序列号 + 数据体。

三、LengthFieldBasedFrameDecoder

new LengthFieldBasedFrameDecoder(
    maxFrameLength,    // 最大帧长度
    lengthFieldOffset,  // 长度字段偏移
    lengthFieldLength,  // 长度字段长度
    lengthAdjustment,   // 长度调整
    initialBytesToStrip // 跳过的字节数
);

四、自定义协议示例

+--------+--------+----------+--------+
| 魔数    | 长度    | 序列号   | 数据   |
| 4 byte | 4 byte | 4 byte   | N byte |
+--------+--------+----------+--------+

五、注意

解码器放在 Pipeline 最前面,业务 Handler 在后面。