• Home
  • Articles
    • 日志
    • 妍小言
    • 舒小书
    • 浩然说
    • 生活日记
  • All Tags

ByteBuf使用小插曲

10 Nov 2017

Reading time ~1 minute

遇到问题

读取服务端返回的数据时多次调用了ByteToMessageDecoder.decode方法,得到多个相同的服务端返回。

排查

  1. 抓包发现服务端服务端未多次发送数据包。
  2. netty在在设计解码器(如ByteToMessageDecoder.decode)时,会重复多次调用decode方法,直到ByteBuf中没有更多的可读数据才会触发下一个ChannelInboundHandler。

检查

发现自定义的解码器调用的是ByteBuf.getBytes(),不会改变ByteBuf的readIndex,也就是说不会被定义为消费了数据。

修复

修改从ByteBuf中获取数据的方式,使用ByteBuf.readBytes()

        int readCount = in.readableBytes();
        byte[] responseData = new byte[readCount];
        in.readBytes(responseData);


nettyByteBuf