Pregunta

Sin bloqueo SocketChannels TCP / IP y Selector en NIO ayudar a mí para manejar muchas conexiones TCP / IP con pequeño número de hilos. Pero ¿qué hay de UDP DatagramChannels? (Debo admitir que no estoy muy familiarizado con UDP.)

UDP envían no parecen operaciones de bloquear incluso si el DatagramChannel no está funcionando en modo de bloqueo. ¿Hay realmente un caso donde los bloques DatagramSocket.send(DatagramPacket) debido a la congestión o algo similar? Estoy muy ansioso por ver si hay un caso así y qué existen los casos posibles en un entorno de producción.

Si DatagramSocket.send(DatagramPacket) en realidad no bloquean y no voy a utilizar un DatagramSocket conectada y se unen a un solo puerto, no hay ninguna ventaja de utilizar el modo no bloqueante con DatagramChannel y Selector?

¿Fue útil?

Solución

Ha sido un tiempo desde que he usado DatagramSockets, Canales y de Java similar, pero todavía le puede dar un poco de ayuda.

El protocolo UDP no establece una conexión TCP al igual que lo hace. Más bien, simplemente envía los datos y se olvida de él. Si es importante para asegurarse de que los datos realmente llega allí, es responsabilidad del cliente. Por lo tanto, incluso si está en modo de bloqueo, su operación de envío será único bloque durante el tiempo que se tarda en vaciar el búfer de salida. Dado que UDP no sabe nada acerca de la red, escribirá a cabo lo antes posible y sin el control de la velocidad de la red o si realmente llega a donde se supone que debe ir. Por lo tanto, para usted, parece como si el canal es en realidad inmediatamente listo para el envío de más.

Otros consejos

UDP no bloquea (sólo bloquea mientras transfiere los datos al sistema operativo) Esto significa que si en algún momento el siguiente salto / conmutador / máquina no puede amortiguar el paquete UDP se deja caer. Esto puede ser el comportamiento deseable en algunas situaciones. Pero es algo que hay que tener en cuenta.

También UDP no garantiza a

  • paquetes de entrega en el orden en que se envían.
  • No para romper los paquetes grandes.
  • enviar paquetes a través de interruptores. A menudo, el reenvío de UDP entre conmutadores está apagado.

Sin embargo UDP soporta multidifusión de modo que el mismo paquete puede ser enviado a uno o más hosts. El remitente tiene ni idea de si alguien recibe los paquetes sin embargo.

Lo complicado de UDP es que la mayoría de las veces funciona, pero no mal a veces en formas que son muy difíciles de reproducir. Por esta razón, usted no debe suponer fiabilidad incluso si lo hace algunas pruebas y parece que funciona.

No UDP de bloqueo es útil sobre todo en el lado receptor. Envío de paquetes sólo puede ser retrasado debido a las circunstancias locales: herramientas para la conformación de tráfico locales como "tarjetas de juego de red" que dan prioridad a tráfico de juegos sobre otras fuentes de tráfico, o tarjeta de red sobrecargada (que no es probable que suceda) pueden retrasar el envío de un paquete. Una vez fuera del sistema. Una vez que el paquete sale de la interfaz local, que ya no es la preocupación de la aplicación.

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