通过使用DelimiterBasedFrameDecoder、FixedLengthFrameDecoder实现分隔符和定长解码器。
TCP以流的方式进行数据传输,上层的应用协议为了对消息进行分区,往往采用下面4种方式:
- 消息长度固定,累计读取到长度总和为定长LEN的报文后,就以为读取到了一个完整的消息;将计数器置位,重新开始读取下一个数据报;
- 将回车换行符作为消息结束符,例如FTP协议,这种方式在文本协议中应用比较广泛;
- 将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符;
- 通过在消息头中定义长度字段来标识消息的总长度。
DelimiterBasedFrameDecoder应用开发
通过对DelimiterBasedFrameDecoder的使用,我们可以自动完成以分隔符作为码流结束标识的消息的解码;通过一个实例来演示,EchoServer接受到EchoClient的请求 消息后,将其打印出来,然后将原始消息返回给客户端,消息以”$_”作为分隔符。
服务端开发
代码清单1 EchoServer服务端EchoServer
代码清单2 EchoServer服务端EchoServerHandler
由于我们设置DelimiterBasedFrameDecoder过滤掉了分隔符,所以,返回给客户端是需要在请求消息尾部拼接分隔符“$_”,最后创建ByteBuf,将原始消息重新返回给客户端。
客户端开发
代码清单3 EchoServer客户端EchoClient
代码清单4 EchoClient客户端EchoClientHandler
服务端与客户端运行
服务端运行结果如下。

客户端运行结果如下。

测试表明DelimiterBasedFrameDecoder可以自动对采用分隔符做码流结束标识的消息进行解码。
DelimiterBasedFrameDecoder没有解码器处理
对服务端的DelimiterBasedFrameDecoder注释掉,代码如图1所示。

图1 删掉DelimiterBasedFrameDecoder后的服务端代码
服务端运行结果如下:

FixedLengthFrameDecoder应用开发
FixedLengthFrameDecoder是固定长度解码器,它能够按照指定长度对消息进行自动解码,开发者不需要考虑TCP的粘包/拆包问题,非常实用。
服务端开发
在服务端的ChannelPipeline中新增FixedLengthFrameDecoder,长度设置为20,然后再依次增加字符串解码器和EchoServerHandler。
代码清单5 EchoServer服务端 EchoServer
代码清单6 EchoServer服务端 EchoServerHandler
利用FixedLengthFrameDecoder解码器,无论一次接收多少数据报,它都会按照构造函数中设置的固定长度进行解码,如果是半包消息,FixedLengthFrameDecoder会缓存半包消息并等待下个包到达后进行拼包,直到一个完整的包。
利用NetAssist软件测试服务端
如图2所示,通过NetAssist软件,发送消息到服务端,消息内容为:https://5iyxx.github.io/categories/Netty-The-Definitive-Guide/ 。

图2 NetAssist软件参数
EchoServer服务端运行结果如图3所示,FixedLengthFrameDecoder解码器按照20个字节对请求进行截取。

图3 EchoServer服务端运行结果