Utilizzando NIO DatagramChannel dovrò gestire parzialmente lettura / pacchetti scritti?

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

  •  22-08-2019
  •  | 
  •  

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top