2

問題が発生しました。メッセージの受信にはnioソケットを使用しています。完全なメッセージが受信されると、受信したメッセージを保持する 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 に答える