Lire et Écrire Int utilisant ByteBuffer en Java NIO

Je veux transmettre un tableau int sur un réseau à l'aide de Datagramme Canal en Java NIO API. Toutefois, les fonctions de lecture/écriture ne peut prendre un ByteBuffer comme une entrée. J'ai donc besoin de stocker les données int à un ByteBuffer et puis le lire sur le récepteur. Je suis confronté au java.nio.BufferUnderflowException. Voici ce que je fais au Côté de l'Expéditeur:

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);
}

Ici, send_data est un tableau 2D où chaque ligne est considéré comme un paquet de données.

Du Côté du Récepteur

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;
           }
 }

De même, recvpkt est un tableau 2D et chaque ligne de il recevra un paquet sur le réseau.

J'ai lu que getInt() lit 4 octets à partir de l' ByteBuffer et déplace la position actuelle de 4 octets. Est-ce que je suis en utilisant le buffer.flip() d'une manière erronée. Je suis nouveau à l'aide NIO et éprouve des difficultés dans la façon d'aller sur le débogage de telles questions.

Mise à JOUR:

L'erreur ne se produit plus. Mais maintenant, tout ce que le Récepteur reçoit est tous des zéros. Alors que je suis de la transmission d'une séquence binaire dans chaque paquet. Quand j'ai lu le dos à partir de la mémoire tampon du côté de l'Expéditeur lui-même, toutes les entrées de tourner correctement mais le tampon reçu à côté du Récepteur a tous les zéros. Aucune idée de pourquoi cela se passe.

Mise à JOUR 2:

Enfin, après des heures de galère, le problème est résolu. Lorsque vous recevez le tampon , vous avez besoin de rembobiner.

  channel.receive(buffer);
  buffer.rewind();

Maintenant, si vous utilisez la méthode getInt sur la mémoire tampon, vous serez en mesure de lire le tampon avec succès.

Ce qui est aussi inefficace que vous pourriez éventuellement faire. Vous devriez allouer un ByteBuffer, de stockage tous les données, et en utilisant votre écriture boucle pour envoyer tout cela.
point de pris .. mais pour l'instant, je veux comprendre pourquoi je suis l'exception mentionnée ci-dessus. Je veux dire, de l'efficacité à part, il n'y a rien de mal avec mon code ?

OriginalL'auteur Aditya | 2012-11-14