编码机

Netty自带的基于字符的编码器和解码

发布时间:2023/6/28 16:05:04   

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。每次拆包都是固定长度的读取信息。



转载请注明:http://www.aideyishus.com/lkzp/5121.html
------分隔线----------------------------