Mit NIO DatagramChannel muss ich teilweise gelesen / geschrieben Pakete zu handhaben?

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

  •  22-08-2019
  •  | 
  •  

Frage

Wenn Socket verwenden, müssen Sie Lese- und Schreibpuffer behalten Teil schreibt zu handhaben und liest.

Ich habe eine nagende Verdacht, dass es nicht erforderlich sein könnte, wenn eine DatagramChannel verwenden, aber info ist knapp.

Was ist die Geschichte?

Soll ich anrufen (non-blocking) erhalten (ByteBuffer) so oft, bis ich einen null zurückbekommen alle wartenden Datagramme zu lesen?

Wenn in nicht-blockierenden Modus zu senden, kann ich mich verlassen send (ByteBuffer, Socket), um entweder die den gesamten Puffer zu senden oder ganz abgelehnt oder muss ich möglicherweise teilweise geschrieben Puffer behalten?

War es hilfreich?

Lösung

Jede Lese eines Datagram ist das gesamte Datagramm, nicht mehr und nicht weniger. Es gibt einen Hinweis darauf, dass dies der Fall ist in der Beschreibung von java.nio.DatagramChannel.read:

  

Wenn es mehr Bytes in der   Datagramm als im gegebenen bleiben   Puffer dann der Rest des   Datagramm wird stillschweigend verworfen

Wenn Sie mit einer Socket es zu tun, es ist ein Nachrichtenstrom; es gibt keine Garantie, wie viel oder wie wenig Daten, die Sie auf jeder Lese erhalten werden, wie TCP getrennte Pakete Zusammenbauen die Nachricht von der anderen Seite zu erstellen. Aber für UDP (das ist das, was Sie mit dem DatagramChannel gerade lesen) jedes Paket seine eigene Atom-Nachricht.

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