Mit NIO DatagramChannel muss ich teilweise gelesen / geschrieben Pakete zu handhaben?
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?
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.