netty之decoder
转载自: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的更多相关文章
- netty的decoder encoder
public class DelimiterBasedFrameDecoder extends ByteToMessageDecoder { 随便找了一个用字符串分割粘包的decoder,继承了Byt ...
- 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 ...
- Netty 中的粘包和拆包
Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...
- Netty编解码器(理论部分)
背景知识 在了解Netty编解码之前,先回顾一下JAVA的编解码: 编码(Encode):在java中称之为序列化,把内存中易丢失的数据结构或对象状态转换成另一种可存储(存储到磁盘),可在网络间传输的 ...
- 为什么游戏公司的server不愿意微服务化?
背景介绍 笔者最近去面试了家游戏公司(有上市).我问他,公司有没有做微服务架构的打算及考量?他很惊讶的,我没听说过微服务耶,你可以解释一下吗? 我大概说了,方便测试,方便维护,方便升级,服务之间松耦合 ...
- Netty自定义Encoder/Decoder进行对象传递
转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...
- Netty入门3之----Decoder和Encoder
Netty强大的地方,是他能方便的实现自定义协议的网络传输.在上一篇文章中,通过使用Netty封装好的工具类,实现了简单的http服务器.在接下来的文章中,我们看看怎么使用他来搭建自定义协议的服务 ...
- 【Netty】使用解码器Decoder解决TCP粘包和拆包问题
解码器Decoder和ChannelHandler的关系 netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter ...
- Netty入门(六)Decoder(解码器)
Netty 提供了丰富的解码器抽象基类,主要分为两类: 解码字节到消息(ByteToMessageDecoder 和 ReplayingDecoder) 解码消息到消息(MessageToMessag ...
随机推荐
- python 01 print input int
学过c语言与c语言的数据结构与算法后再来学习python,感觉编程的核心内容没有变,但每个编程语言都有自己的特点.本次学习的目标是理解python的特点与用法,把学过的bif(内置函数)用法记录下来, ...
- C++炮台实验
炮台实验 蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,... ,n的炮台各一个,他需要把这 n个炮台从左往右排成一行,并且炮口都朝向右边. 在这个游戏中,所有炮台发射的炮弹会摧毁前方所有高度比 ...
- Linux进程管理与性能监控
1. 进程管理工具 这一节我们介绍进程管理工具: 使用进程管理工具,我们可以查询程序当前的运行状态,或终止一个进程: 任何进程都与文件关联:我们会用到lsof工具(list opened files) ...
- idea配置ssm框架
详细教程如下:https://blog.csdn.net/GallenZhang/article/details/5193215 https://blog.csdn.net/qq_28008917/a ...
- centos7 编译安装 redis-6.0.5
安装redis sudo yum install redis centos自带的redis才3.2 太旧了所以使用源码编译 需要先安装gcc新版才能编译 centos7 默认的 gcc 版本为:4.8 ...
- 你怎么改造和重新设计一个ATM银行自动取款机
- 贫血模型和DDD模型
贫血模型和DDD模型 1.贫血模型 1.1 概念 常见的mvc三层架构 简单.没有行为 2.领域驱动设计 2.1 概念(2004年提出的) Domain Driven Design 简称 DDD DD ...
- golang mysql demo
Go操作Mysql数据库 使用Go操作MySQL等数据库,一般有两种方式:一是使用database/sql接口,直接在代码里硬编码sql语句:二是使用gorm,即对象关系映射的方式在代码里抽象的操作数 ...
- 修改vsftpd的默认根目录/var/ftp/pub到另一个目录
修改ftp的根目录只要修改/etc/vsftpd/vsftpd.conf文件即可: 加入如下几行: local_root=/var/www/html chroot_local_user=YES ano ...
- 基于 abp vNext 微服务开发的敏捷应用构建平台 - 项目介绍
缘起 目前使用ABP框架已经将近3年了,大大小小的项目也陆陆续续做了很多.由于现有信息系统的架构模式是在底层的技术平台上直接构建信息系统并采用技术主导,使用业务无关的编程工具来开发信息系统的缺陷使得系 ...