转载自: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
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. 常见端口 HTTP代码
  2. Jmeter分布式测试搭建(二)
  3. 【Linux】LAMP环境的搭建
  4. Angular2 从0到1 (二)
  5. n个骰子的点数
  6. (转)用JS判断ckeditor3.6版本编辑器内容为空的方法
  7. iOS——文件操作NSFileManager (创建、删除,复制,粘贴)
  8. Java基础知识强化63:Arrays工具类之方法源码解析
  9. NullSafe 的原理
  10. [SCOI2010]幸运数字 [容斥原理 dfs]
  11. python第六篇文件处理类型
  12. java导出csv格式文件
  13. EF 下如何更新数据表数据
  14. Linux教程--基础命令
  15. day 37-8 关于mysql 的增 删 改 查 及联合列表
  16. [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
  17. linux socket编程示例
  18. 51nod 1042数字0-9的数量
  19. HTTP/1.0中,状态码200 301 304 403 404 500的含义?
  20. 如何使用 sqlite3 访问 Android 手机的数据库

热门文章

  1. ms14-064漏洞复现
  2. goalng包和命令工具
  3. golang安装及vscode编辑器配置
  4. failed to find romfile &quot;vgabios-stdvga.bin&quot;
  5. pandas 数据表中的字符与日期数据的处理
  6. Java面试题(Hibernate篇)
  7. 使用 Postman 做 API 自动化测试
  8. laravel封装方法在blade视图中使用
  9. Unity游戏资源反解工具
  10. zabbix-4.0-监控服务器的ping告警设置