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.相关推荐

  1. netty报错 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1

    netty报错,报错信息如下: io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1 这是因为SimpleChan ...

  2. Netty报错 远程主机强迫关闭了一个现有的连接 异常

    百度百科的描述 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...

  3. netty报错:远程主机强迫关闭了一个现有的连接。(已解决)

    昨天,java 集成netty服务的项目,在测试服务器上,发现了一个问题: 1.项目netty包版本:netty-all-5.0.0.Alpha1.jar. 2.问题的描述:服务器启动,各种通信正常, ...

  4. netty报错:io.netty.channel.ChannelPipelineException

    1.九月 23, 2018 8:35:02 下午 io.netty.channel.ChannelInitializer channelRegistered 警告: Failed to initial ...

  5. 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 ...

  6. 库卡机器人goto指令_遨博机器人报错代码:任务转移命令Goto和弹窗命令Message

    11.6.10  任务转移命令Goto Goto 命令可以中断当前任务,并转向其他任务. ➢  点击昵称右侧空白输入框,可修改命令名称. ➢  点击移除可删除此选中的 Goto 命令. ➢  点击确认 ...

  7. Netty诡异报错did not read anything but decoded a message

    ###前言 用netty做数据校验的时候,很自然的想法是写一个decoder,比如XXXXChecksumDecoder,如果校验出错,就丢弃这个数据包,一般来说,这种单纯的做数据校验的decoder ...

  8. SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist –

    SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist – 如下的Outbound delivery 0080000801 ...

  9. linux还原数据库报错,RMAN还原数据库报错问题解决案例

    报错1.数据库开启block change tracking ,恢复完成后打开因文件不存在报错. RMAN> alter database open resetlogs; RMAN-00571: ...

最新文章

  1. 刀片服务器在现有数据中心的应用策略
  2. 现在很多技术知识点缺乏来龙去脉的介绍
  3. Airbnb欺诈预测机器学习模型设计:准确率和召回率的故事 发表于2015-07-15 16:14| 3926次阅读| 来源AirBNB/Data| 1 条评论| 作者Ariana Radianto
  4. 重磅!阿里巴巴开源首个边缘计算云原生项目 OpenYurt
  5. 使软件可二次开发_基于C++的?UG二次开发
  6. MCU VR班會(05)記錄
  7. 理解Shadow DOM
  8. oracle 中增加行,Oracle中实现FORM表单插入、锁定、更新行、删除行的包
  9. 实例30:python
  10. Linux系统 Centos6 安装
  11. 查看php探针,什么是php探针
  12. 【小样本基础】小样本学习方法总结:模型微调、数据增强、迁移学习
  13. 什么情况下,英文单词中的k发音变g,t发音变d,p发音变b
  14. Java 生成数字证书系列(三)生成数字证书
  15. 遇到U盘无法打开,属性显示0字节这样的问题?数据该如何导出?
  16. POJ 3088 Push Botton Lock
  17. 智慧公厕解决方案,光明源智慧公厕解决方案全解
  18. 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
  19. Django Iframe +Form 上传图片文件等 前端显示
  20. Swagger2常用注解说明

热门文章

  1. 虚幻引擎图文笔记:使用布料模拟(Cloth Simulation)系统制作一面可以随风飘动的旗帜(更新)
  2. JWT、JWS与JWE
  3. nginx配置点播服务
  4. Scp全量远程拷贝(推送、拉取)
  5. ArtWork.Conversion.
  6. 函函函函函函函函函函函数——two
  7. Channel 通道详解
  8. 如何换主题不被搜索降权
  9. Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之五
  10. 华芯投资40亿现金收购美芯片测试设备厂商Xcerra