Netty: Weird IndexOutOfBoundsException: readerIndex + length exceeds writerIndex

情到浓时终转凉″ 提交于 2019-12-04 11:45:29

Your code assumes that your communication channel is handling framing. That is, it expects that when you send 1024 bytes, then the receive handler will receive a bytebuf of exactly 1024 bytes. As far as I can tell, your code is writing directly to TCP which is a stream based protocol and does not work this way. If you write 1024 bytes, the peer will receive all 1024 bytes, but the bytes may arrive in pieces - for example two calls channelRead0 (the first with 300 and the second with 724).

Fortunately, Netty includes several out-of-the-box framing codecs to handle this for you. See the example at http://netty.io/4.0/xref/io/netty/example/worldclock/WorldClockServerInitializer.html

It shows how to configure a server channel with the ProtobufVarint32FrameDecoder (which ensures the next handler in the pipeline always receives exactly one frame of bytes at a time) and the ProtobufVarint32LengthFieldPrepender (which takes care of adding the frame length header to all outgoing messages)

I recommend you change your code to insert these (or similar framing codecs) into your pipeline. Then modify your application code to not call readVarInt and writeVarInt since the codec will take care of this for you. The size of the received ByteBuf will always match the size of the sent ByteBuf because the decoder took care of aggregating any fragments.

Do you make sure you have enough bytes readable in the ByteBuf when start to read stuff from it. It seems like you do not. Check the ByteToMessageDecoder to see how you can ensure it in a decoder

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!