我目前正在通过 netty 发送不同的数据包,并且经常遇到这样的异常收到它们时:
java.lang.IndexOutOfBoundsException: readerIndex(39) + length(32) exceeds writerIndex(64): UnpooledUnsafeDirectByteBuf(ridx: 39, widx: 64, cap: 2048)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1166)
at io.netty.buffer.AbstractByteBuf.readBytes(AbstractByteBuf.java:655)
at <snip>.PacketDataHolder.readString(PacketDataHolder.java:79)
......
或者
java.lang.IndexOutOfBoundsException: readerIndex(0) + length(1) exceeds writerIndex(0): UnpooledUnsafeDirectByteBuf(ridx: 0, widx: 0, cap: 2048)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1166)
at io.netty.buffer.AbstractByteBuf.readByte(AbstractByteBuf.java:570) ......
这是我发送数据包的方式:
public void sendPacket(Packet packet) {
PacketDataHolder packetDataHolder = new PacketDataHolder(); //I'm creating a packetDataHolder, code is below
packetDataHolder.writeHeader(packet); //Then i'm adding the packet ID as a header
packet.writeData(packetDataHolder); //Then I'm writing the data of the packet (String for example)
socketChannel.writeAndFlush(packetDataHolder.getByteBuf()); //Then I'm sending the packet
}
以及我如何接收和阅读它们:
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception {
PacketDataHolder packetDataHolder = new PacketDataHolder(byteBuf); //First I'm creating a PacketDataHolder containing the bytebuf
Packet packet = PacketParser.parsePacket(packetDataHolder); //Then I'm parsing the header I wrote (The packet id)
这是相关代码:
(PacketDataHolder 类)
公共同步无效writeHeader(数据包数据包){
this.writeByte(packet.getId());
}
public synchronized byte readHeader() {
return this.readByte();
}
public synchronized void writeByte(int value) {
this.byteBuf.writeByte(value);
}
public synchronized byte readByte() {
return this.byteBuf.readByte();
}
public synchronized void writeString(String value) {
if(value == null)
value = "An error occurred while displaying this message";
byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
if (bytes.length > 32767)
throw new EncoderException("String too big (was " + value.length()
+ " bytes encoded, max 32767)");
else {
writeVarInt(bytes.length);
byteBuf.writeBytes(bytes);
}
}
public synchronized String readString() {
int length = readVarInt();
if (length < 0)
throw new DecoderException(
"The received encoded string buffer length is less than zero! Weird string!");
return new String(byteBuf.readBytes(length).array(),
StandardCharsets.UTF_8);
}
我描述的第一个错误总是发生在 writeString 方法中,所以我认为它以任何方式与此相关。
我认为这主要是在发送很长的字符串时发生的,但我不确定。
如果您需要更多示例代码,请随时询问!
我希望你可以帮助我,
燃烧器