Utilizzando NIO DatagramChannel dovrò gestire parzialmente lettura / pacchetti scritti?
Domanda
Quando si utilizza SocketChannel, è necessario mantenere i buffer di lettura e scrittura per gestire le operazioni di scrittura parziali e legge.
Ho un sospetto che potrebbe non essere necessario quando si utilizza un DatagramChannel, ma informazioni è scarsa.
Qual è la storia?
Devo chiamare (non bloccante) ricezione (ByteBuffer) più volte fino a ottenere un nulla di nuovo per leggere tutti i datagrammi in attesa?
Quando si invia in modalità non-blocking, posso contare su send (ByteBuffer, SocketAddress) per inviare il l'intero buffer o rifiutare del tutto, o devo tenere possibilmente buffer parzialmente scritte?
Soluzione
Ogni lettura di un Datagram è l'intero datagramma, niente di più, niente di meno. C'è un accenno al fatto che questo è il caso nella descrizione di java.nio.DatagramChannel.read:
Se ci sono più byte nel datagramma che rimanere nella proposta tamponi poi il resto del datagram è silenziosamente scartato
Quando hai a che fare con un SocketChannel, si tratta di un flusso di messaggi; non c'è alcuna garanzia quanto o quanto poco i dati si otterrà su ogni lettura, come TCP è riassemblando pacchetti separati per ricreare il messaggio dall'altra parte. Ma per UDP (che è quello che stai leggendo con la DatagramChannel) ogni pacchetto è il suo proprio messaggio atomica.