Question

non bloquante TCP / IP et SocketChannels Selector dans NIO aider moi à gérer plusieurs connexions TCP / IP avec petit nombre de threads. Mais que diriez-vous DatagramChannels UDP? (Je dois admettre que je ne suis pas très familier avec UDP.)

opérations UDP envoyer ne semblent pas bloquer même si le DatagramChannel ne fonctionne pas en mode bloquant. Est-il vraiment un cas où des blocs de DatagramSocket.send(DatagramPacket) en raison de la congestion ou quelque chose de similaire? Je suis vraiment curieux de savoir s'il y a un tel cas, et quels sont les cas possibles existent dans un environnement de production.

Si DatagramSocket.send(DatagramPacket) ne bloque pas vraiment et je ne vais pas utiliser un DatagramSocket connecté et se lier à un seul port, est-il pas avantage d'utiliser le mode non-bloquant avec DatagramChannel et Selector?

Était-ce utile?

La solution

Il a été un moment que je l'ai utilisé les DatagramSockets de Java, chaînes, etc., mais je ne peux vous donner encore un peu d'aide.

Le protocole UDP ne crée pas de connexion comme le fait TCP. Au contraire, il envoie simplement les données et l'oublie. S'il est important de vous assurer que les données obtient effectivement là, qui est la responsabilité du client. Ainsi, même si vous êtes en mode bloquant, votre opération d'envoi bloquera seulement aussi longtemps que nécessaire pour vider la mémoire tampon. Étant donné que UDP ne sait rien sur le réseau, il l'écrire à la première occasion sans vérifier la vitesse du réseau ou si elle se fait à l'endroit où il est censé aller. Ainsi, pour vous, il apparaît comme si le canal est en fait immédiatement prêt à envoyer plus.

Autres conseils

UDP ne bloque pas (on ne bloque pendant qu'il transfère les données vers le système d'exploitation) Cela signifie que si, à tout moment, le saut suivant / commutateur / machine ne peut pas tamponner le paquet UDP, il laisse tomber. Cela peut être un comportement souhaitable dans certaines situations. Mais il est quelque chose que vous devez être au courant.

UDP ne garantit pas à

  • paquets de livraison dans l'ordre où ils sont envoyés.
  • ne pas briser les gros paquets.
  • paquets avant à travers les commutateurs. Souvent, le transfert UDP entre les commutateurs est désactivé.

UDP ne porte toutefois en charge la multidiffusion de sorte que le même paquet peut être livré à un ou plusieurs hôtes. L'expéditeur n'a aucune idée si quelqu'un reçoit les paquets cependant.

Une chose plus délicate sur UDP est-il fonctionne la plupart du temps, mais échoue mal, parfois de manière très difficiles à reproduire. Pour cette raison, vous ne devriez pas assumer la fiabilité même si vous faites quelques tests et il semble fonctionner.

UDP non de blocage est surtout utile sur le côté de la réception. Packet envoi ne peut être retardée en raison de circonstances locales: des outils de mise en forme de trafic locales comme « cartes réseau de jeu » qui accordent la priorité du trafic de jeu sur d'autres sources de trafic, ou carte réseau surchargé (ce qui est susceptible de se produire) peut retarder l'envoi d'un paquet. Une fois hors du système. Une fois que le paquet quitte l'interface locale, il n'est plus le souci de l'application.

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