我遇到了一个问题。我使用nio socket接收消息。收到完整的消息后,我将保存接收到的消息的dataBuffer发送给另一个用户。但是下面有异常(exception)。问题出在哪儿?我尝试调用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);

}

最佳答案

每当将数据读入缓冲区时,如果要将缓冲区写出另一个 channel ,则需要在写入之前调用:buffer.flip()。如果在与读取相同的线程上进行写入,则无需复制缓冲区。

另外-BufferOverflowException意味着您将超出缓冲区容量的数据放入缓冲区。这听起来像是缓冲区没有被调用buffer.clear()来将位置重置为零。

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

10-04 23:04