Java Netty抛出IndexOutOfBoundsException
我目前正致力于将Netty集成到使用XML消息进行通信的服务器。这些XML消息实际上是已序列化为XML消息的对象,然后通过TCP连接发送这些XML消息。我可以发送和接收对象,但在向服务器发送的第二条消息中出现以下异常:Java Netty抛出IndexOutOfBoundsException,java,xml,networking,stream,netty,Java,Xml,Networking,Stream,Netty,我目前正致力于将Netty集成到使用XML消息进行通信的服务器。这些XML消息实际上是已序列化为XML消息的对象,然后通过TCP连接发送这些XML消息。我可以发送和接收对象,但在向服务器发送的第二条消息中出现以下异常: java.lang.IndexOutOfBoundsException: readerIndex(306) + length(613) exceeds writerIndex(614): UnpooledUnsafeDirectByteBuf(ridx: 306, widx: 6
java.lang.IndexOutOfBoundsException: readerIndex(306) + length(613) exceeds writerIndex(614): UnpooledUnsafeDirectByteBuf(ridx: 306, widx: 614, cap: 1024)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1161)
at io.netty.buffer.AbstractByteBuf.skipBytes(AbstractByteBuf.java:734)
at io.netty.buffer.WrappedByteBuf.skipBytes(WrappedByteBuf.java:540)
at io.netty.handler.codec.xml.XmlFrameDecoder.decode(XmlFrameDecoder.java:176)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:227)
我有以下代码来初始化通道:
@Override
public void initChannel(SocketChannel ch) throws Exception {
LOGGER.info("Accepted connection from " + ch.remoteAddress().toString());
ClientConnection connection = new ClientConnection(ch);
ch.pipeline().addLast(new XmlFrameDecoder(6000), connection);
}
以及以下代码来处理我收到的消息:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
LOGGER.info("Got data");
ByteBuf buf = (ByteBuf)msg;
try (ByteBufInputStream is = new ByteBufInputStream(buf)) {
Message message = MessageFactory.getInstance().deserialize(is);
// does stuff with message...
} catch (Throwable ex) {
LOGGER.log(Level.WARNING, ex.getMessage(), ex);
} finally {
ReferenceCountUtil.release(msg);
}
}
此代码用于发送消息:
public void sendMessage(Message msg) {
ByteBufAllocator alloc = PooledByteBufAllocator.DEFAULT;
ByteBuf buf = alloc.buffer(1024);
try (ByteBufOutputStream outputStream = new ByteBufOutputStream(buf)) {
String message = MessageFactory.getInstance().serialize(msg) + "\0";
outputStream.write(message.getBytes());
this.socketChannel.writeAndFlush(buf);
} catch (IOException ex) {
LOGGER.log(Level.INFO, ex.getMessage(), ex);
}
}
我使用java.beans.XMLDecoder和XMLEncoder对XML对象进行编码/解码。由于我发送的消息大小为307,我认为应该在处理完消息后清除缓冲区,但事实并非如此。有人知道我的问题是什么吗?结果发现问题是XMLEncoder在XML文档末尾添加了一个\n,当Netty开始阅读XML消息时,这个问题就搞砸了 如果您认为这是一个棘手的问题,请您将问题提交到?谢谢