Lesen und Schreiben Int mit ByteBuffer im Java NIO
Möchte ich übermitteln, die ein int-array über ein Netzwerk mit Datagramm-Kanal in Java NIO API. Jedoch, die Funktionen Lesen/schreiben kann nur ein ByteBuffer
als input. So brauche ich zum speichern von int-Daten zu einem ByteBuffer
und dann Lesen Sie es zurück an den Empfänger. Ich bin mit der java.nio.BufferUnderflowException
. Hier ist was ich tun auf der Sender-Seite:
for(i = 0; i < send_data.length; i++)
{
//Write the data onto Buffer
ByteBuffer buffer1 = ByteBuffer.allocate(send_data[i].length*4);
for(j = 0; j < send_data[i].length; j++)
buffer1.putInt(send_data[i][j]);
buffer1.flip();
//Transmit the data
while(buffer1.hasRemaining())
channel.write(buffer1);
}
Hier send_data
ist ein 2D-array, wobei jede Zeile behandelt wird als separates Datenpaket.
Auf der Empfängerseite
for(i = 0; i < k; i++)
{
ByteBuffer buffer = ByteBuffer.allocate((recvpkt[0].length)*4);
channel.receive(buffer);
j = 0;
while(buffer.hasRemaining())
{
recvpkt[i][j] = buffer.getInt();
j = j+1;
}
}
Ebenso recvpkt
ist ein 2D-array, und jede Zeile von ihm erhalten ein Paket aus dem Netzwerk.
Habe ich gelesen, dass getInt()
liest 4 Byte aus dem ByteBuffer
und verschiebt die aktuelle position von 4 bytes. Ist es, dass ich die buffer.flip()
in einer falschen Art und Weise. Ich bin neu mit NIO
und habe Schwierigkeiten, die in, wie man über das Debuggen solcher Probleme.
UPDATE:
Der Fehler nicht mehr Auftritt. Aber jetzt alle, dass der Empfänger bekommt alle Nullen. Während ich bin übertragung einer Binär-Sequenz in jedem Päckchen. Wenn ich wieder Lesen aus dem Puffer auf Sender-Seite selbst, alle Einträge auftauchen richtig, aber die Puffer bekamen auf der Empfänger-Seite hat alle Nullen. Keine Ahnung, warum dies geschieht.
UPDATE 2:
Endlich, nach Stunden des Kampfes, das problem ist behoben. Wenn Sie erhalten die Puffer , die Sie brauchen, um es zurückzuspulen.
channel.receive(buffer);
buffer.rewind();
Wenn Sie verwenden jetzt die getInt-Methode auf den Puffer, werden Sie in der Lage sein zu Lesen der Puffer erfolgreich.
point taken .. aber derzeit will ich verstehen, warum bin ich immer der der oben genannten Ausnahme. Ich meine, Effizienz abgesehen, gibt es etwas falsch mit meinem code ?
InformationsquelleAutor Aditya | 2012-11-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie th flip() der Puffer jedes mal, wenn Sie die swap-vom schreiben zum Lesen und vom Lesen zum schreiben. Hinzufügen von spiegeln() im zweiten Beispiel wird nach
receive()
Sobald diese arbeiten, sollten Sie schauen, wie Sie wieder verwenden können Sie Ihre ByteBuffers und EJP schlägt.
In beiden Fällen schreiben Sie die Puffer und die position hat den Punkt es geschrieben hat. Dann sollten Sie Lesen, von Anfang bis zu dem Punkt, was geschrieben wurde. Der einzige Unterschied zwischen den beiden Beispielen, die nicht das schreiben, und wer macht die Lektüre, aber man braucht ein flip zwischen Ihnen in beiden Fällen.
Trotz seiner (dummen) Namen, die flip() ist nicht zu sich selbst invers. Sie müssen flip, bevor Sie schreiben oder erhalten, und compact() oder clear() danach.
Wenn Sie die compact() oder clear(), die Sie nicht brauchen, um flip() wie gut es tut, für Sie.
Nein ist es nicht. Es ist nicht ein reversibler Vorgang. Es wäre richtiger zu sagen, dass der flip() bereitet den Puffer für das schreiben oder abrufen, und compact () - und clear() wird der Puffer bereit zum Lesen oder setzen. Wenn Sie nur flip() anstelle von compact() oder clear() funktioniert es nicht.
InformationsquelleAutor Peter Lawrey