当前位置: 编码机 >> 编码机资源 >> Netty自带的基于字符的编码器和解码
LengthFieldBasedFrameDecoder和LengthFieldPrepender
ch.pipeline().addLast(newLengthFieldBasedFrameDecoder(,0,2,0,2));
ch.pipeline().addLast(newLengthFieldPrepender(2));
编码器LengthFieldPrepender给数据添加报文头Length字段
解码器LengthFieldBasedFrameDecoder
参数(1)maxFrameLength:表示的是包的最大长度,超出会做一些特殊处理。
参数(2)lengthFieldOffset:指定长度域的偏移量,表示跳过指定长度个字节才是长度域;
参数()lengthFieldLength:本数据帧的长度;
参数(4)lengthAdjustment:该字段加长度字段等于数据帧的长度,包体长度调整的大小。
参数(5)initialBytesToStrip:获取完一个完整的数据包之后,忽略前面的指定的位数个字节。
LineBasedFrameDecoder
//\n以及\r\n两种类型的行分隔符ch.pipeline().addLast(newLineBasedFrameDecoder());
需要UTF-8编码;
maxLength的属性,用来检测接收到的消息长度,如果超出了长度限制,则会抛出TooLongFrameException异常;
stripDelimiter属性,用来判断是否需要将delimiter过滤掉;
failFast,如果该值为true,那么不管frame是否读取完成,只要frame的长度超出了maxFrameLength,就会抛出TooLongFrameException。如果该值为false,那么TooLongFrameException会在整个frame完全读取之后再抛出。
DelimiterBasedFrameDecoder
上面讲的LineBasedFrameDecoder只对行分隔符有效,如果我们的frame是以其他的分隔符来分割的话LineBasedFrameDecoder就用不了了,所以netty提供了一个更加通用的DelimiterBasedFrameDecoder,这个frameDecoder可以自定义delimiter。
FixedLengthFrameDecoder
除了进行ByteBuf中字符比较来进行frame拆分之外,还有一些其他常见的frame拆分的方法,比如根据特定的长度来区分,netty提供了一种这样的decoder叫做FixedLengthFrameDecoder。每次拆包都是固定长度的读取信息。