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.

Das ist in etwa so ineffizient wie Sie machen könnte. Sie sollten die Zuweisung von einzige ByteBuffer, die Speicherung von allen die Daten, und dann mit der write-Schleife, um es zu senden alle.
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

Schreibe einen Kommentar