2

我遇到了一个问题。我使用 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);

}
4

2 回答 2

2

每当您将数据读入缓冲区时,如果要将缓冲区写入另一个通道,则需要 buffer.flip()在写入之前调用::如果您在阅读时在同一个线程上写入,则不需要复制缓冲区。

此外 - BufferOverflowException 意味着您将更多的数据放入缓冲区而不是其容量。这听起来像没有buffer.clear()调用缓冲区来将位置重置为零。

上面没有足够的代码来准确诊断问题所在。

于 2012-06-19T14:06:13.627 回答
1

您的程序在放置数据时抛出异常,所以我会说位置/限制有问题。

看起来您正在尝试将数据放入读取缓冲区或尝试放入比其大小更多的数据。缓冲区不会自行增长(ByteArrayOutputStream 对此更好)。

在java 文档中阅读有关清除、倒带和翻转的信息。这将重置缓冲区的位置、限制或大小。

于 2011-06-01T21:40:11.907 回答