java nio und ByteBuffer problem
Traf ich ein problem. Ich benutze nio socket zu empfangen, die Nachricht. Auf eine vollständige Nachricht empfangen wird, schicke ich den dataBuffer, das hält die empfangene Nachricht an einen anderen Benutzer. Aber es gibt Ausnahme Sie unten. Wo ist das problem? Ich versuche zu nennen, dataBuffer.duplicate() und schreiben Sie es auf. Aber auf der Empfängerseite, die read-operation wirft eine solche Ausnahme. Ich habe zum zuweisen eines neuen ByteBuffer und machen Sie eine neue Kopie von Nachricht und schreiben Sie es auf. In diesem Fall ist es kein Fehler. Aber ich will nicht die Kopie Schritt. Gibt es eine andere Möglichkeit es zu lösen?
Ausnahme geworfen
java.nio.BufferOverflowException
at java.nio.HeapByteBuffer.put(Unknown Source)
at java.nio.ByteBuffer.put(Unknown Source)
at serviceHandlerPackage.ServiceHandler.readComplete(ServiceHandler.java:218)
Code
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);
}
- bitte geben Sie den relevanten code.
- schlechte Titel der Frage... ich meine, es erklärt nicht dein problem. Sie bieten weniger code, als wir benötigen, um Ihnen zu helfen lösen Sie Ihr problem. zum Beispiel Ihre dataBuffer ist nie initialisiert...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wann auch immer Sie Lesen Daten in einen Puffer, wenn Sie wollen, schreiben Sie den Puffer aus einem anderen Kanal, den Sie aufrufen müssen:
buffer.flip()
vor dem schreiben. Sie nicht brauchen, um doppelte Puffer beim schreiben auf den gleichen thread wie du liest.Auch - BufferOverflowException bedeutet, dass Sie setzen mehr Daten in den Puffer, als seine Kapazität. Das klingt wie ein Puffer ist nicht immer
buffer.clear()
aufgerufen, um auf die Ausgangsposition zurücksetzen auf null.Gibt es nicht genug code oben geschrieben, um zu diagnostizieren, was genau das problem ist.
Dein Programm wirft eine Ausnahme aus, während Daten, so würde ich sagen, dass etwas falsch ist mit positions - /Begrenzung.
Es sieht aus wie Sie versuchen, Daten in Puffer Lesen oder versuchen, mehr Daten, als es die Größe. Puffer wird nicht wachsen selbst (ByteArrayOutputStream besser ist für diese).
Lesen Sie über die Lichtung, Zurückspulen und spiegeln in java-Dokumentation. Dies wird die reset-position, Begrenzung oder Größe der Puffer.