跳到主要内容

五、Netty 教程 – 解码器详解

作者:唐亚峰 | 出自:唐亚峰博客

> TCP以流的形式传输,在上一章,我们讲了粘包和拆包,以及LineBaseFrameDecoder使用和源码探讨,接下来讲讲Netty为我们实现的其它解码器…..

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

  • 固定消息长度,累计读取到长度和定长LEN的报文后,就认为读取到了个完整的消息,然后将计数器位置重置在读取下一个报文内容
  • 将回车换行符作为消息结束符\r\n,列如FTP协议,这种方式在文本中应用比较广泛
  • 将特殊分隔符作为消息结束符标志位,回车换行符就是一个特殊结束分隔符(DelimiterBasedFrameDecoder)
  • 通过在消息头定义一个长度字段来标示消息的总长度(FixedLengthFrameDecoder)

Netty对以上4种做个统一抽象封装,提供了四种不同解码器来解决对应问题,使用起来也非常的方便,了解了它们,我们就不需要自己对读取的报文人工解码,也不需要考虑TCP粘包和拆包的问题了…

Delimiter自定义分隔符

> 我将公共的部分做了一层抽离,定义成常量方便调用

public interface EchoConstant {
String SEPARATOR = "$_";//特殊分割符号,DelimiterBasedFrameDecoder使用
Integer ECHO_DELIMITER_PORT = 4040;
Integer ECHO_LENGTH_PORT = 5050;
String HOST = "127.0.0.1";
Integer FRAME_LENGTH = 10;//固定消息长度,FixedLengthFrameDecoder使用
}

> 定义EchoDelimiterServer,毫无疑问大部分代码和以前类似,区别是多了一个日志输出以及DelimiterBasedFrameDecoder的使用

划重点:在做开发调试的时候,我们可以使用Netty为我们提供的LoggingHandler输出日志