L'utilisation NIO DatagramChannel dois-je traiter partiellement lus / écrits paquets?

StackOverflow https://stackoverflow.com/questions/707351

  •  22-08-2019
  •  | 
  •  

Question

Lors de l'utilisation SocketChannel, vous devez conserver lire et écrire des tampons pour gérer écritures et lectures partielles.

Je soupçonne lancinante qu'il pourrait ne pas être nécessaire lors de l'utilisation d'un DatagramChannel, mais les informations sont rares.

Quelle est l'histoire?

Dois-je appeler (sans blocage) recevoir (ByteBuffer) à plusieurs reprises jusqu'à ce que je reçois un nul retour à lire tous les datagrammes en attente?

Lors de l'envoi en mode non-bloquant, puis-je compter sur envoyer (ByteBuffer, SocketAddress) soit d'envoyer le tampon tout ou rejeter complètement, ou dois-je besoin de garder éventuellement des tampons partiellement écrits?

Était-ce utile?

La solution

Chaque lecture d'un Datagram est l'ensemble datagrammes, rien de plus, rien de moins. Il y a une allusion au fait que c'est le cas dans la description de java.nio.DatagramChannel.read:

  

S'il y a plus d'octets dans la   datagrammes que de rester dans la donnée   des tampons, puis le reste de la   datagramme est éliminé en silence

Lorsque vous avez affaire à un SocketChannel, c'est un flux de messages; il n'y a aucune garantie combien ou peu de données que vous obtiendrez sur chaque lecture, TCP est Remontage de paquets séparés pour recréer le message de l'autre côté. Mais pour UDP (qui est ce que vous lisez avec le DatagramChannel) chaque paquet est son propre message atomique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top