保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

netty系列之netty中的自动解码器ReplayingD

  简介
  netty提供了一个从ByteBuf到用户自定义的message的解码器叫做ByteToMessageDecoder,要使用这个decoder,我们需要继承这个decoder,并实现decode方法,从而在这个方法中实现ByteBuf中的内容到用户自定义message对象的转换。
  那么在使用ByteToMessageDecoder的过程中会遇到什么问题呢?为什么又会有一个ReplayingDecoder呢?带着这个问题我们一起来看看吧。ByteToMessageDecoder可能遇到的问题
  要想实现自己的解码器将ByteBuf转换成为自己的消息对象,可以继承ByteToMessageDecoder,然后实现其中的decode方法即可,先来看下decode方法的定义:protectedvoiddecode(ChannelHandlerContextctx,ByteBufbuf,ListObjectout)throwsException
  输入的参数中buf是要解码的ByteBuf,out是解码过后的对象列表,我们需要把ByteBuf中的数据转换成为我们自己的对象加入out的list中。
  那么这里可能会遇到一个问题,因为我们在调用decode方法的时候buf中的数据可能还没有准备好,比如我们需要一个Integer,但是buf中的数据不够一个整数,那么就需要一些buf中数据逻辑的判断,我们以一个带有消息长度的Buf对象来描述一下这个过程。
  所谓带有消息长度的Buf对象,就是说Buf消息中的前4位,构成了一个整数,这个整数表示的是buf中后续消息的长度。
  所以我们读取消息进行转换的流程是,先读取前面4个字节,得到消息的长度,然后再读取该长度的字节,这就是我们真正要获取的消息内容。
  来看一下如果是继承自ByteToMessageDecoder应该怎么实现这个逻辑呢?publicclassIntegerHeaderFrameDecoderextendsByteToMessageDecoder{Overrideprotectedvoiddecode(ChannelHandlerContextctx,ByteBufbuf,ListObjectout)throwsException{if(buf。readableBytes()4){return;}buf。markReaderIndex();intlengthbuf。readInt();if(buf。readableBytes()length){buf。resetReaderIndex();return;}out。add(buf。readBytes(length));}}
  在decode中,我们首先需要判断buf中可读的字节有没有4个,没有的话直接返回。如果有,则先读取这4个字节的长度,然后再判断buf中的可读字节是否小于应该读取的长度,如果小于,则说明数据还没有准备好,需要调用resetReaderIndex进行重置。
  最后,如果所有的条件都满足,才真正进行读取工作。
  有没有一个办法可以不提前进行判断,可以直接按照自己想要的内容来读取buf的方式呢?答案就是ReplayingDecoder。
  我们先来看一下上面的例子用ReplayingDecoder重写是什么情况:publicclassIntegerHeaderFrameDecoderextendsReplayingDecoderVoid{protectedvoiddecode(ChannelHandlerContextctx,ByteBufbuf,ListObjectout)throwsException{out。add(buf。readBytes(buf。readInt()));}}
  使用ReplayingDecoder,我们可以忽略buf是否已经接收到了足够的可读数据,直接读取即可。
  相比之下ReplayingDecoder非常的简单。接下来,我们来探究一下ReplayingDecoder的实现原理。ReplayingDecoder的实现原理
  ReplayingDecoder实际上是ByteToMessageDecoder的一个子类,它的定义如下:publicabstractclassReplayingDecoderSextendsByteToMessageDecoder
  在ByteToMessageDecoder中,最重要的方法是channelRead,在这个方法中实际调用了callDecode(ctx,cumulation,out);来实现cumulation到out的解码过程。
  ReplayingDecoder的秘密就在于对这个方法的重写,我们来看下这个方法的具体实现:protectedvoidcallDecode(ChannelHandlerContextctx,ByteBufin,ListObjectout){replayable。setCumulation(in);try{while(in。isReadable()){intoldReaderIndexcheckpointin。readerIndex();intoutSizeout。size();if(outSize0){fireChannelRead(ctx,out,outSize);out。clear();if(ctx。isRemoved()){break;}outSize0;}SoldStatestate;intoldInputLengthin。readableBytes();try{decodeRemovalReentryProtection(ctx,replayable,out);if(ctx。isRemoved()){break;}if(outSizeout。size()){if(oldInputLengthin。readableBytes()oldStatestate){thrownewDecoderException(StringUtil。simpleClassName(getClass())。decode()mustconsumetheinbounddataorchangeitsstateifitdidnotdecodeanything。);}else{continue;}}}catch(Signalreplay){replay。expect(REPLAY);if(ctx。isRemoved()){break;}Returntothecheckpoint(oroldPosition)andretry。intcheckpointthis。checkpoint;if(checkpoint0){in。readerIndex(checkpoint);}else{}break;}if(oldReaderIndexin。readerIndex()oldStatestate){thrownewDecoderException(StringUtil。simpleClassName(getClass())。decode()methodmustconsumetheinbounddataorchangeitsstateifitdecodedsomething。);}if(isSingleDecode()){break;}}}catch(DecoderExceptione){throwe;}catch(Exceptioncause){thrownewDecoderException(cause);}}
  这里的实现和ByteToMessageDecoder不同的是ReplayingDecoder中定义了一个checkpoint,这个checkpint是在尝试进行数据解码之初设置的:intoldReaderIndexcheckpointin。readerIndex();
  如果是在解码的过程中出现了异常,则使用checkpoint重置index:intcheckpointthis。checkpoint;if(checkpoint0){in。readerIndex(checkpoint);}else{}
  这里捕获的异常是Signal,Signal是什么呢?
  Signal是一个Error对象:publicfinalclassSignalextendsErrorimplementsConstantSignal
  这个异常是从replayable中抛出来的。
  replayable是一个特有的ByteBuf对象,叫做ReplayingDecoderByteBuf:finalclassReplayingDecoderByteBufextendsByteBuf
  在ReplayingDecoderByteBuf中定义了Signal属性:privatestaticfinalSignalREPLAYReplayingDecoder。REPLAY;
  这个Signal异常是从ReplayingDecoderByteBuf中的get方法中抛出的,这里以getInt为例,看一下异常是如何抛出的:publicintgetInt(intindex){checkIndex(index,4);returnbuffer。getInt(index);}
  getInt方法首先会去调用checkIndex方法进行buff中的长度检测,如果小于要读取的长度,则会抛出异常REPLAY:privatevoidcheckIndex(intindex,intlength){if(indexlengthbuffer。writerIndex()){throwREPLAY;}}
  这就是Signal异常的由来。总结
  以上就是对ReplayingDecoder的介绍,虽然ReplayingDecoder好用,但是从它的实现可以看出,ReplayingDecoder是通过抛出异常来不断的重试,所以在某些特殊的情况下会造成性能的下降。
  也就是说在减少我们代码量的同时,降低了程序的执行效率。看来要想马儿跑又想马儿不吃草,这样的好事是不可能的了。本文已收录于http:www。flydean。com144nettyreplayingdecoder
  最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
  欢迎关注我的公众号:程序那些事,懂技术,更懂你!

2016中考作文热点主题及素材和谐互助社会是一个大家庭,我们每个人都是其中一分子。随着时代的发展,人与人之间的联系越来越紧密,团结、友爱、互助成了现代人必不可少的社会素养。只有拥有这些优秀的品质,社会才能融洽和睦、……阳光初二作文眼见着雨势大起来,黑云压城一般,我却只能任雨点打落在身上,脑海中一遍遍地浮现着这次考试的成绩,旋转木马一样真是糟糕透了,连天气都要和自己作对啊。回去该如何向爸妈开口呢?我一边想……我的特长作文550字每一个人都有自己特长,而我也不例外,我的特长就是跳舞!在我8岁之前一个特长也没有,爷爷奶奶觉得我除了学习成绩好些外,其他的什么都不会,就把我送去少年宫去跳舞,在张老师的舞……许多光品学网专稿未经允许不得转载想和你约定,约定一生,约定只属于我们的约定。静静地,我在寂静的蓝光里流下了眼泪。慢慢的你拉起我的手,但留在脸面上的泪水,依旧得由我自……快乐的国庆节叙事日记今天,天高云淡,秋高气爽,我和爸爸妈妈快快乐乐地去公园玩儿。快到公园了,远远地望去,公园门口飞着一条彩色的龙。走近一看,原来是一条用五颜六色的花做成的龙舟。走进公园便看见……温暖如火心间记温暖是什么?有人说:温暖,是冬天的一缕阳光,让冰冷的心灵感受到温度;有人说:温暖,是黑暗中的一盏明灯,让呆滞的眼神闪烁出光芒;有人说:温暖。是寒夜中的一座小屋,为你抵抗严寒中的……光通信行业景气上升光迅科技持续加强研发投入布局高端市场本报记者李万晨曦中国电信、中国联通近日宣布,将在100个以上主要城市开通5G新通话超清视频语音通话服务(VoNR)。日前,中国移动也表示将试用VoNR。数据显示,目前中国……高三立志名言事业常成于坚忍,毁于急躁不问收获,但问耕耘!天道酬勤。超越自己,向自己挑战,向弱项挑战,向懒惰挑战,向陋习挑战。淡薄功利,轻装前进;不计付出,坚韧不拔;不达目的,誓不罢休。对于18岁……有关春天的景色作文600字7篇在现实生活或工作学习中,大家都写过作文,肯定对各类作文都很熟悉吧,作文根据体裁的不同可以分为记叙文、说明文、应用文、议论文。那么,怎么去写作文呢?以下是小编精心整理的春天的景色……以尊严为话题的作文800字尊严是上帝赋予的丰厚的天机,是人类与生俱来的本性,他扎根于人的心灵,被自信所浇灌,为智慧所滋润,受着整个人类文明的哺育,折射出民族精神的灵光。以下是品学网小编为大家整理的以尊严……小鱼童话作文小鱼童话作文1在一片美丽的湖泊里,有两条小鱼,一条叫乐乐,它性格开朗,总想去大海游一游。一条叫美美,它性格胆小,三心二意,见到什么稀奇的事物,总会盯了上去。乐乐下定……家乡巨变小学作文家乡巨变小学作文我的家乡在保定,保定的强盛直接反映在百姓的衣食住行上。曾何几时,短缺与生活如影相随,票证与我们朝夕相伴,城里人攒着几十元的月工资节衣缩食。而今,人们……
描写自然风光的作文范文10篇生活中并不缺少风景,只要我们拥有一双善于发现的眼睛。以下是小编整理的描写自然风光的作文,希望对大家有帮助!描写自然风光的作文篇1寒假了,凛冽的寒风来到了。不知为何,一放假……新能源汽车保值率提高12月中国汽车保值率研究报告发布日前,中国汽车流通协会与精真估联合对外发布《2021年12月中国汽车保值率研究报告》(以下简称《报告》)。《报告》指出,随着2021年12月份新车置换的恢复,二手车源也出……看花灯E度网专稿未经允许不得转载在英语中元宵节是lanternfestival,这个单词是由lantern灯笼,和festival节日组成的,我不用说大家也知道今天的主角是谁了……西瓜视频联合抖音发布中视频2021发展趋势报告月活创作者数量e公司讯,1月10日,西瓜视频联合抖音、今日头条发布的《中视频2021发展趋势报告》显示,2021年,上述三个平台的月活中视频创作者数量同比增加80。2021年6月,西瓜视频联……2022物联网机器人市场投资前景分析及供需格局研究预测报告物联网机器人行业前景、物联网机器人行业现状如何?受制造业自动化改造需求影响,2020年中国、日本、美国、韩国和德国等主要国家工业机器人的年装机量合计超过全球72。9,2021年……2016年十一国庆节祝福句子金秋十月国庆日,万里河山披锦绣;欢歌声声连不断,花儿艳艳吐芬芳;小编收集了2016年十一国庆节祝福句子,欢迎阅读。1。十月十日,送你十分健康的身体,十分快乐的心情,十分漂……华为有望推出国产自研内核浏览器谷歌脸书遭法国罚款2。1亿欧元华为有望推出国产自研内核浏览器1月8日,数码博主长安数码君发文称,华为浏览器的某位自身经理透露,大概再过两年就能够看到更好的华为浏览器问世。如今浏览器的四大内核分别是,T……2。4寸触屏搭人体工学键盘,刷抖音玩微信,三防老人机也能这么随着手机硬件和功能的不断升级,日常生活中给人们带来了不小的便利,人们对手机的依赖性也逐渐增强,随处可见青少年熟练的玩着各种智能手机,但是这些复杂的操作和时尚的机型,对于老人来说……赞颂母亲的作文范文导语:再过几天,就是我们最伟大的母亲的日子了,让我们在这里赞扬一下我们的母亲吧!以下是小编为大家整理的赞颂母亲的作文范文,欢迎大家阅读与借鉴!赞颂母亲的作文范文(1)在我……怪不得手机电池这么不耐用,原来是这2个功能没关闭分享生活小妙招,共享科技新生活!大家好,欢迎来到今天的知识分享!我是你们的好朋友小俊!如果您的手机经常出现耗电快,电池不耐用,那么这2个开关一定要关闭!一、关闭自启动应用……这不得馋哭了iQOO8系列这些新功能真贴心智能手机行业这几年的发展趋势似乎并没有前几年那么迅猛。各家都在疯狂堆料的同时,手机硬件同质化的现象也与日俱增。于是现在的消费者在选择一款手机是时候,在关注手机硬件的同时,似乎也……微信朋友圈封面视频怎么弄?来看设置动态视频的方法前几天没事干,躺在床上玩手机。在随意观看微信好友朋友圈的时候,有了新发现。好友的朋友圈封面不是图片,而是动态视频。要知道,在过去,朋友圈封面只能设置图片,视频是无法设置的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网