Netty 系列 ———— (三) 常用编码解码


Netty管道的处理流程

示意图

当客户端向服务端发起请求时,会先经过客户端的编码器,然后经过服务端的解码器,在服务端处理完请求以后,再经过服务端的编码器,客户端接受到 服务端的返回以后,先经过客户端的解码器然后再进入到客户端的流程里面。

netty里面内置的编码器和解码器都是可以被添加到管道里面的组件,因为他们都实现了ChannelHandler的接口

StringEncoder和StringDecoder

StringDecoder是将ByteBuf接转换为字符串的编码器,在netty里面,编码器和解码器一般都是成对出现的,也就是说一个编码器和一个解码器是同时作用于客户端 和服务端的这样才能对消息编码和解码成功

ch.pipeline().addLast(new StringDecoder(UTF_8));
ch.pipeline().addLast(new SimpleClientHandler());
ch.pipeline().addLast(new StringEncoder(UTF_8));
ch.pipeline().addLast(new StringDecoder(UTF_8));
ch.pipeline().addLast(new SimpleServerHandler());
ch.pipeline().addLast(new StringEncoder(UTF_8));

DelimiterBasedFrameDecoder

DelimiterBasedFrameDecoder是一个用于解决拆包和粘包的解码器,主要用于消息通过特殊字符来分割,比如换行符或者我们自己自定义的符号。

// 设置来制表符为特殊的分隔符
ByteBuf byteBuf = Unpooled.copiedBuffer("\t".getBytes(UTF_8));
ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, byteBuf));
ch.pipeline().addLast(new SimpleServerHandler());

使用解码器 源码地址: netty-demo-delimiter

FixedLengthFrameDecoder

FixedLengthFrameDecoder定长解码器,也是可以解决拆包和沾包的。主要是通过消息定长来解决网络传输的拆包和粘包问题。比如和服务端约定,消息定长为1024 这种解码器就适用于这种场景 使用定长解码器的时候,一定要注意发送消息的长度,如果长度不够服务端是无法接受到任何消息的

ch.pipeline().addLast(new FixedLengthFrameDecoder(1024));
ch.pipeline().addLast(new SimpleClientHandler());

源码地址: netty-demo-fixed

  #netty 

« Netty 系列 ———— (二) 客户端初步使用 Hello Docker »
blog comments powered by Disqus