我遇到了一个问题。我使用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()
来将位置重置为零。
上面没有编写足够的代码来准确诊断问题所在。