Usando NIO DatagramChannel voy a tener que manejar paquetes parcialmente leer / escribir?

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

  •  22-08-2019
  •  | 
  •  

Pregunta

Cuando se utiliza SocketChannel, es necesario retener leer y escribir memorias intermedias para manejar las escrituras parciales y lee.

Tengo una persistente sospecha de que no podría ser necesaria cuando se utiliza un DatagramChannel, pero es escasa información.

¿Cuál es la historia?

¿Debo llamar (no-bloqueo) recibir (ByteBuffer) varias veces hasta que consiga un nulo volver a leer todos los datagramas de espera?

Cuando se envía en modo de no bloqueo, puedo depender de envío (ByteBuffer, SocketAddress) para enviar el conjunto de la memoria intermedia o rechazar por completo, o tengo que mantener posiblemente memorias intermedias parcialmente escritos?

¿Fue útil?

Solución

Cada lectura de un datagrama es todo el datagrama, nada más y nada menos. Hay un indicio de que este es el caso en la descripción de java.nio.DatagramChannel.read:

  

Si hay más bytes en el   datagrama de permanecer en el dado   tampones entonces el resto de la   datagrama se desecha silenciosamente

Cuando usted está tratando con un SocketChannel, es una secuencia de mensajes; no hay garantía de lo mucho o lo poco que los datos que obtendrá en cada lectura, como TCP se vuelva a montar paquetes separados para recrear el mensaje desde el otro lado. Pero para UDP (que es lo que estás leyendo con el DatagramChannel) cada paquete es su propio mensaje atómica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top