netty 多个解码器,netty分隔符解码器
00-1010上一小节:解码器读取的不完整数据的逻辑分析
我们知道解码器需要继承ByteToMessageDecoder,重写decode方法将解析后的对象放入一个集合中,解析后的对象可以在ByteToMessageDecoder中向下传播。本节带你分析一下最简单的解码器FixedLengthFrameDecoder,从它入手了解解码器的相关原理。
FixedLengthFrameDecoder是一个定长解码器,它的作用是根据固定长度截取固定大小字节数进行解码。
00-1010公共类fixedlengthframecoder扩展bytetomessagedecoder {//length private final int frame length;public FixedLengthFrameDecoder(int frameLength){ if(frameLength=0){ throw new IllegalArgumentException( frameLength必须是正整数: frameLength);}//保存当前帧长度this。framelength=framelength} @ override protected final void Decode(通道处理程序上下文CTX,ByteBuf in,listobject out)抛出异常{//Decode by byte buf。解码到对象后,加到out Object decoded=decode(ctx,in);如果(解码!=null) {//将解析后的byteBuf加入对象out.add(已解码);}}是受保护对象decode(@ suppress warnings( unused parameters )channelhandlercontext CTX,byte bufin)抛出一个小于此固定长度的异常{//bytes if(in。可读字节()帧长){返回null} else {//当前累加器截取。读取该长度的保留切片(帧长度);}}}我们看到这个类继承了ByteToMessageDecoder,重写了decode方法。
这个类只有一个名为frameLength的属性,它在构造函数中初始化。
再看解码方法。在decode方法中,调用另一个重载的decode方法进行解析。解析后,解析后的数据放入set out中。
在00-1010重载解码方法中,首先判断累加器的字节数是否小于定长,如果小于定长,则返回null,表示不是完整的数据包,直接返回null。
如果它大于或等于固定长度,则直接从累加器中截取该长度的值。
英寸readretentedslice (frameLength)将返回一个新的截断字节数,并将原来的累加器读指针向后移动frameLength字节。
如果累加器中还有数据,它将通过ByteToMessageDecoder中callDecode方法中的while循环继续解码。
这样就实现了定长解码工作。
本文对Netty分布式定长解码器的实现原理分析到此结束。关于Netty分布式定长解码器的更多信息,请搜索热门IT之前的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。