遇到问题
读取服务端返回的数据时多次调用了ByteToMessageDecoder.decode
方法,得到多个相同的服务端返回。
排查
- 抓包发现服务端服务端未多次发送数据包。
- 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);