转载自:https://blog.csdn.net/jzft_nuosu/article/details/80341018

netty的handler和decoder中的channelRead和decode方法的执行理解

对于ChannelInboundHandlerAdapter中的channelRead(ChannelHandlerContext ctx, Object msg),如果在这个处理器之前还没有做任何处理,则msg的类型为io.netty.buffer.PooledUnsafeDirectByteBuf,当你读取数据的时候如果读取的字节数超过了msg中writerIndex则程序将直接报异常,当你正常读取其中的数据后必须要强制执行ctx.fireChannelRead(msg)才能通知下一个处理器进行处理,还有一个问题就是,如果下一个处理器所需要的数据是msg的全部数据,则必须调用msg.resetReaderIndex()将读索引重置到开始位置。

对于ReplayingDecoder中的decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out),in的类型是io.netty.handler.codec.ReplayingDecoderByteBuf,当你读取数据的时候如果读取的字节数超过了in中writerIndex则程序不报任何错误,而是过了一段时间又重新执行该方法一遍,这是因为ReplayingDecoderByteBuf是一个特殊的ByteBuf,当它读取超出最大索引的时候会抛出RELAY异常,然后被处理,证明数据还未全部到达,将再次通知执行,但是这个地方如果后续没有数据进来的话好像是通过定时来进入的,应该没什么意义,而且最终会重复进入两次,总共执行三次。
---------------------
作者:jzft
来源:CSDN
原文:https://blog.csdn.net/jzft_nuosu/article/details/80341018
版权声明:本文为博主原创文章,转载请附上博文链接!

netty之decoder的更多相关文章

  1. netty的decoder encoder

    public class DelimiterBasedFrameDecoder extends ByteToMessageDecoder { 随便找了一个用字符串分割粘包的decoder,继承了Byt ...

  2. Netty Tutorial Part 1.5: On Channel Handlers and Channel Options [z]

    Intro: After some feedback on Part 1, and being prompted by some stackoverflow questions, I want to ...

  3. Netty 中的粘包和拆包

    Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...

  4. Netty编解码器(理论部分)

    背景知识 在了解Netty编解码之前,先回顾一下JAVA的编解码: 编码(Encode):在java中称之为序列化,把内存中易丢失的数据结构或对象状态转换成另一种可存储(存储到磁盘),可在网络间传输的 ...

  5. 为什么游戏公司的server不愿意微服务化?

    背景介绍 笔者最近去面试了家游戏公司(有上市).我问他,公司有没有做微服务架构的打算及考量?他很惊讶的,我没听说过微服务耶,你可以解释一下吗? 我大概说了,方便测试,方便维护,方便升级,服务之间松耦合 ...

  6. Netty自定义Encoder/Decoder进行对象传递

    转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...

  7. Netty入门3之----Decoder和Encoder

    ​ Netty强大的地方,是他能方便的实现自定义协议的网络传输.在上一篇文章中,通过使用Netty封装好的工具类,实现了简单的http服务器.在接下来的文章中,我们看看怎么使用他来搭建自定义协议的服务 ...

  8. 【Netty】使用解码器Decoder解决TCP粘包和拆包问题

    解码器Decoder和ChannelHandler的关系 netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter ...

  9. Netty入门(六)Decoder(解码器)

    Netty 提供了丰富的解码器抽象基类,主要分为两类: 解码字节到消息(ByteToMessageDecoder 和 ReplayingDecoder) 解码消息到消息(MessageToMessag ...

随机推荐

  1. 源码解析JDK1.8-HashMap链表成环的问题解决方案

    前言 上篇文章详解介绍了HashMap在JDK1.7版本中链表成环的原因,今天介绍下JDK1.8针对HashMap线程安全问题的解决方案. jdk1.8 扩容源码解析 public class Has ...

  2. 微信小程序-人脸识别

    wx.checkIsSupportFacialRecognition({success:res=>{ wx.startFacialRecognitionVerifyAndUploadVideo( ...

  3. swagger2配置详解

    1.写在controller上的注解 1.1 @Api 代码 @Api(tags = "用户相关接口", description = "提供用户相关的 Rest API& ...

  4. linux zip压缩文件忽略指定的文件夹

    zip -r productImages.zip ./* -x "cache**" 压缩时,会忽略cache下的所有文件及文件夹

  5. Combining STDP and Reward-Modulated STDP in Deep Convolutional Spiking Neural Networks for Digit Recognition

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 灵长类视觉系统激发了深度人工神经网络的发展,使计算机视觉领域发生了革命性的变化.然而,这些网络的能量效率比它们的生物学对 ...

  6. Kafka内部实现原理

    Kafka是什么 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 1)Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开 ...

  7. JdbcTemplate jar包 下载

    我给了一个链接, 是jar download网站上的. 能上去的就可以下载. https://jar-download.com/maven-repository-class-search.php?se ...

  8. systemctl 如何启动、关闭、启用/禁用服务

    启动服务:systemctl start xxx.service 关闭服务:systemctl stop xxx.service 重启服务:systemctl restart xxx.service ...

  9. 为什么 list(range) 比 [i for i in range()] 快?

    为什么 list(range) 比 [i for i in range()] 快? t0 = time.time() list(range(100000)) print(time.time()-t0) ...

  10. WebStorm 运行Rect Native 项目

    今天教大家如何直接使用WebStorm这个IDE直接完成编码+运行项目工作.这样就可以不用打开Xcode了. 1.首先点击WebStorm右上方的下拉箭头弹出的Edit Configurations. ...