TCP粘包/拆包问题之Netty解决方案

TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下四种方式:

  • 消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息;将计数器置位,重新开始读取下一个数据报;

  • 将回车换行符作为消息结束符,例如FTP协议,这种方式在文本协议中应用比较广泛;

  • 将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符;

  • 通过在消息头中定义长度字段来标识消息的总长度。
    Netty对上面四种应用做了统一的抽象,提供了四种解码器来解决对应的问题,使用起来非常方便。使用这些解码器,用户不需要自己对读取的报文进行人工解码,也不需要考虑TCP的粘包与拆包。
    Netty提供解码器如下:

  • DelimiterBasedFrameDecoder 基于消息边界方式进行粘包拆包处理

  • FixedLengthFrameDecoder 基于固定长度消息进行粘包拆包处理

  • LengthFieldBasedFrameDecoder 基于消息头指定消息长度进行粘包拆包处理

  • LineBasedFrameDecoder 基于行来进行消息粘包拆包处理

1.DelimiterBasedFrameDecoder原理:

DelimiterBasedFrameDecoder类属性

 /**
     * 分隔符
     */
    private final ByteBuf[

猜你喜欢

转载自blog.csdn.net/luliuliu1234/article/details/103867570
今日推荐