TCP以流的方式进行数据传输,上层的应用协议为了对消息进行区分,往往采用如下四种方式:
-
消息长度固定,累计读取到长度总和为定长LEN的报文后,就认为读取到了一个完整的消息;将计数器置位,重新开始读取下一个数据报;
-
将回车换行符作为消息结束符,例如FTP协议,这种方式在文本协议中应用比较广泛;
-
将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符;
-
通过在消息头中定义长度字段来标识消息的总长度。
Netty对上面四种应用做了统一的抽象,提供了四种解码器来解决对应的问题,使用起来非常方便。使用这些解码器,用户不需要自己对读取的报文进行人工解码,也不需要考虑TCP的粘包与拆包。
Netty提供解码器如下: -
DelimiterBasedFrameDecoder 基于消息边界方式进行粘包拆包处理
-
FixedLengthFrameDecoder 基于固定长度消息进行粘包拆包处理
-
LengthFieldBasedFrameDecoder 基于消息头指定消息长度进行粘包拆包处理
-
LineBasedFrameDecoder 基于行来进行消息粘包拆包处理
1.DelimiterBasedFrameDecoder原理:
DelimiterBasedFrameDecoder类属性
/**
* 分隔符
*/
private final ByteBuf[