java nio和ByteBuffer问题

时间:2011-06-01 19:04:20

标签: java sockets nio bytebuffer

我遇到了一个问题。我使用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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

了解java documentation中的清算,倒带和翻转。这将重置缓冲区的位置,限制或大小。