【Netty报错:】XXXDecoder.decode() did not read anything but decoded a message.
Netty解码器报错:XXXDecoder.decode() did not read anything but decoded a message.
从字面意思来看,就是说没有读取任何数据,但是却解析出来了一个对象。
1、问题引出
在写自定义的基于String的解码器的时候,在使用该解码器进行解码的时候会抛出这个异常。
- 对应的解码器代码很简单,就是将ByteBuf转化为一个字符串,然后添加到list中,供后面的handler进行处理。
- 编码器代码也很简单,就是将字符串变成一个byte数组,写到ByteBuf中,供后面的handler进行处理。
2、ByteToMessageDecoder源码解析
当有数据到来的时候,会调用handler的channelRead方法,代码逻辑很简单大概分为三步:
- 读取字节流,累加字节流
- 将读取到的字节流交由子类的decoder方法解析,也就是我们自定义的解码器
- 将解析出来的对象继续向下传播
其中在调用子类decoder方法的时候,会有这么一段判断逻辑:
- 记录一下在解析之前list里面的对象数量。
- 记录一下解析之前字节流里面可读的字节数。
- 然后调用子类的解析方法
- 调用之后,list里面的对象和之前的相等,说明没有解析出对象,此时分两种情况,一种没有读取到数据,另一种解析出部分数据但不够构成一个对象
- 最后就来到异常抛出的地方,也就是解析出来了对象,但是bytebuf可读的字节容量和解析之前可读的字节数是相等的,换句话说就是明明解析出来了对象,但是没有读取走数据,因此这里会抛出异常。
那么为什么会进这个if呢?看自定义的解码器,只是单纯的将byteBuf转换成了一个String,byteBuf的readIndex并没有任何移动,因此byteBuf可读的字节数量在解析前后是相等的。
3、问题解决
知道了异常抛出的原因,这下解决它还是很简单的,只需要让byteBuf的readindex索引随读取的数据向前移动即可,因此可以有两种解决方式:
- 将buteBuf里面的数据读取到放在一个byte数组中,然后,将byte数组转化为String向下传播,这样byteBuf的readIndex会向前移动的。
- 继续采用之前的方式,但是读取完之后,人为让readindex向前移动:
采用这两种方式,均可以完美解决问题。
4、MessageToMessageDecoder
String解码器的目的是把Byte解析为String,因此我们也可以继承MessageToMessageDecoder,泛型指定ByteBuf,也可以完成转换的需求,因为在这个类的channelRead中是直接调用子类的decoder方法,没有上面的那句if判断,因此自然也不会抛出那个问题:
采用这种方式也可以解决问题。
【Netty报错:】XXXDecoder.decode() did not read anything but decoded a message.相关推荐
- netty报错 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
netty报错,报错信息如下: io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1 这是因为SimpleChan ...
- Netty报错 远程主机强迫关闭了一个现有的连接 异常
百度百科的描述 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...
- netty报错:远程主机强迫关闭了一个现有的连接。(已解决)
昨天,java 集成netty服务的项目,在测试服务器上,发现了一个问题: 1.项目netty包版本:netty-all-5.0.0.Alpha1.jar. 2.问题的描述:服务器启动,各种通信正常, ...
- netty报错:io.netty.channel.ChannelPipelineException
1.九月 23, 2018 8:35:02 下午 io.netty.channel.ChannelInitializer channelRegistered 警告: Failed to initial ...
- karas报错filename = 'fine_tuned_net.h5', file descriptor = 24, errno = 28, error message = 'No space l
karas epochs=50,在第14时报错 File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrap ...
- 库卡机器人goto指令_遨博机器人报错代码:任务转移命令Goto和弹窗命令Message
11.6.10 任务转移命令Goto Goto 命令可以中断当前任务,并转向其他任务. ➢ 点击昵称右侧空白输入框,可修改命令名称. ➢ 点击移除可删除此选中的 Goto 命令. ➢ 点击确认 ...
- Netty诡异报错did not read anything but decoded a message
###前言 用netty做数据校验的时候,很自然的想法是写一个decoder,比如XXXXChecksumDecoder,如果校验出错,就丢弃这个数据包,一般来说,这种单纯的做数据校验的decoder ...
- SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist –
SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist – 如下的Outbound delivery 0080000801 ...
- linux还原数据库报错,RMAN还原数据库报错问题解决案例
报错1.数据库开启block change tracking ,恢复完成后打开因文件不存在报错. RMAN> alter database open resetlogs; RMAN-00571: ...
最新文章
- 刀片服务器在现有数据中心的应用策略
- 现在很多技术知识点缺乏来龙去脉的介绍
- Airbnb欺诈预测机器学习模型设计:准确率和召回率的故事 发表于2015-07-15 16:14| 3926次阅读| 来源AirBNB/Data| 1 条评论| 作者Ariana Radianto
- 重磅!阿里巴巴开源首个边缘计算云原生项目 OpenYurt
- 使软件可二次开发_基于C++的?UG二次开发
- MCU VR班會(05)記錄
- 理解Shadow DOM
- oracle 中增加行,Oracle中实现FORM表单插入、锁定、更新行、删除行的包
- 实例30:python
- Linux系统 Centos6 安装
- 查看php探针,什么是php探针
- 【小样本基础】小样本学习方法总结:模型微调、数据增强、迁移学习
- 什么情况下,英文单词中的k发音变g,t发音变d,p发音变b
- Java 生成数字证书系列(三)生成数字证书
- 遇到U盘无法打开,属性显示0字节这样的问题?数据该如何导出?
- POJ 3088 Push Botton Lock
- 智慧公厕解决方案,光明源智慧公厕解决方案全解
- 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
- Django Iframe +Form 上传图片文件等 前端显示
- Swagger2常用注解说明