Frage

Non-Blocking-TCP / IP SocketChannels und Selector in NIO helfen mir viele TCP / IP-Verbindungen mit einer kleinen Anzahl von Threads zu verarbeiten. Aber wie wäre es UDP DatagramChannels? (Ich muss zugeben, dass ich mit UDP nicht sehr vertraut bin.)

UDP senden Operationen scheinen nicht, selbst wenn der DatagramChannel nicht in Betrieb ist Modus bei der Blockierung zu blockieren. Gibt es wirklich einen Fall, in dem DatagramSocket.send(DatagramPacket) Block aufgrund von Überlastung oder etwas ähnliches? Ich bin wirklich gespannt, ob es solch ein Fall, und was die möglichen Fälle gibt es in einer Produktionsumgebung.

Wenn DatagramSocket.send(DatagramPacket) eigentlich nicht blockieren, und ich bin nicht verbunden DatagramSocket nicht benutzen wollen und binden an nur einem Port, gibt es keinen Vorteil bei der Verwendung nicht-blockierenden Modus mit DatagramChannel und Selector?

War es hilfreich?

Lösung

Es ist schon eine Weile her, seit ich Javas DatagramSockets, Kanäle und dergleichen verwendet habe, aber ich kann Ihnen noch etwas Hilfe geben.

Das UDP-Protokoll ist nicht festgelegt, eine Verbindung wie TCP tut. Vielmehr sendet sie nur die Daten und vergisst darüber. Wenn es wichtig ist, um sicherzustellen, dass die Daten tatsächlich dort ankommt, ist, dass in der Verantwortung des Kunden. So, auch wenn Sie im Blockiermodus ist, wird Ihr Sendevorgang nur so lange blockieren, wie es aus den Puffern zu spülen nimmt. Da UDP, nichts über das Netzwerk weiß, dass es sie so bald wie möglich schreiben, ohne die Netzwerkgeschwindigkeit überprüft oder ob es tatsächlich bekommt, wo es angeblich zu gehen. Somit Sie scheint es, als ob der Kanal tatsächlich sofort bereit für mehr zu senden.

Andere Tipps

UDP nicht blockiert (es nur blockiert, während es die Daten an die OS übertragen) Das bedeutet, an jedem Punkt, wenn der nächste Hop / Schalter / Maschine nicht das UDP-Paket es sinkt puffern kann. Dies kann erwünschtes Verhalten in einigen Situationen sein. Aber es ist, dass Sie etwas sein, müssen sich bewusst sein.

UDP auch nicht garantieren

  • Lieferpakete in der Reihenfolge, wie sie gesendet werden.
  • nicht große Pakete zu brechen.
  • Vorwärts-Pakete über Schalter. Oft UDP-Weiterleitung zwischen Schalter ausgeschaltet ist.

Allerdings UDP unterstützt Multicast so das gleiche Paket an einem oder mehr Hosts geliefert werden kann. Der Absender hat keine Ahnung, ob jemand die Pakete empfängt jedoch.

Eine heikle Sache über UDP ist es die meiste Zeit funktioniert, aber nicht schlecht manchmal in einer Weise, die sehr schwer zu reproduzieren. Aus diesem Grunde sollten Sie die Zuverlässigkeit nicht davon ausgehen, auch wenn Sie ein paar Tests durchführen, und es scheint zu funktionieren.

Nicht blockiert UDP ist meist dann sinnvoll auf der Empfangsseite. Paket sendet nur aufgrund der örtlichen Gegebenheiten verzögert wird: lokale Traffic-Shaping-Tools wie „Gaming-Netzwerkkarten“, die Gaming-Verkehr über andere Verkehrsquellen zu priorisieren oder überlastetes Netzwerk-Karte (die wahrscheinlich nicht geschehen ist) kann das Senden eines Pakets verzögern. Einmal aus dem System heraus. Sobald das Paket die lokale Schnittstelle verlässt, ist es nicht mehr die Sorge der Anwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top