【问题标题】:java nio and ByteBuffer problemjava nio和ByteBuffer问题
【发布时间】:2011-06-01 19:04:19
【问题描述】:

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

}

【问题讨论】:

  • 请提供相关代码。
  • 问题的错误标题...我的意思是,它不能解释您的问题。您提供的代码少于我们帮助您解决问题所需的代码。例如,您的 dataBuffer 从未初始化...

标签: java sockets nio bytebuffer


【解决方案1】:

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

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

上面编写的代码不足以准确诊断问题所在。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多