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.
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
Vous devez vous connecter pour publier un commentaire.
Vous avez th flip() de la mémoire tampon à chaque fois que vous changez d'écriture de lire et de lire à l'écriture. Ajouter flip() pour le deuxième exemple après
receive()
Une fois que vous avez ce que vous devriez regarder comment vous pouvez les utiliser de nouveau votre ByteBuffers et EJP suggère.
Dans les deux cas vous écrire dans le buffer et de la position du point où il a écrit jusqu'à. Ensuite, vous avez besoin de lire à partir du début jusqu'à la pointe qui a été écrit. La seule différence entre les deux exemples est de qui l'écrit et qui fait de la lecture, mais vous avez besoin d'un flip entre eux dans les deux cas.
En dépit de son (stupide) nom, flip() n'est pas l'inverse de lui-même. Vous devez la retourner avant d'écrire ou de se faire, et compact() ou désactivez() par la suite.
Si vous compact() ou désactivez(), vous n'avez pas besoin de flip() tout comme il le fait pour vous.
Non, il n'est pas. Ce n'est pas un fonctionnement réversible. Il serait plus correct de dire que le flip() prépare le tampon d'écriture et compact() et clear() faire le tampon prêt pour la lecture ou la mettre. Si vous venez d'utiliser flip() à la place du compact() ou désactivez() ça ne fonctionne pas.
OriginalL'auteur Peter Lawrey