Java NIO和ByteBuffer问题

3
我遇到了一个问题。我使用nio socket接收消息。当完整的消息接收完成后,我将持有接收消息的dataBuffer发送给另一个用户。但是出现了下面的异常。问题出在哪里?我尝试调用dataBuffer.duplicate()并将其写出。但在接收方,读取操作会抛出这样的异常。我不得不分配一个新的ByteBuffer并复制消息,然后再写出。在这种情况下,就没有错误了。但我不想进行复制步骤。是否有其他方法来解决这个问题? 抛出的异常
java.nio.BufferOverflowException
    at java.nio.HeapByteBuffer.put(Unknown Source)
    at java.nio.ByteBuffer.put(Unknown Source)
    at serviceHandlerPackage.ServiceHandler.readComplete(ServiceHandler.java:218)

代码

readEventHAndler(SocketChannel socket) {
   readCompleteData(socket);
}

readCompleteData(Socket) {
    ByteBuffer dataBuffer; //hold complete message
    if(!dataComplete)  return;
    else   process(dataBuffer);
}

process(dataBuffer) {
   ...

   processHandler();

   sendNext(dataBuffer);

}


sendNext(dataBuffer) {
    write(dataBuffer);

}

2
请提供相关的代码。 - mre
1
问题的标题不好...我的意思是,它没有解释清楚你的问题。你提供的代码不足以帮助我们解决你的问题。例如,你的dataBuffer从未被初始化... - logoff
2个回答

3
每当你读取数据到缓冲区时,如果想要将缓冲区写入另一个通道,需要在写入之前调用:buffer.flip()。如果在同一线程中读写,则无需复制缓冲区。
此外,BufferOverflowException 表示你向缓冲区中放入的数据超过了其容量。这听起来像是没有调用 buffer.clear() 将位置重置为零。
以上代码不足以诊断问题的具体原因。

1

你的程序在放置数据时抛出了异常,所以我认为位置/限制出现了问题。

看起来你正在尝试将数据放入读取缓冲区或者尝试放入超过其大小的数据。缓冲区不会自动增长(ByteArrayOutputStream更好)。

阅读Java文档中有关清除、倒回和翻转的内容。这将重置缓冲区的位置、限制或大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接