write socketclient socket examples example java sockets networking tcp

java - socketclient - ¿Cómo afecta TCP_NODELAY a las llamadas consecutivas write()?



socketclient java (2)

TCP_NODELAY es una opción para permitir el envío rápido de paquetes TCP, independientemente de su tamaño. Esta es una opción muy útil cuando la velocidad importa, sin embargo, tengo curiosidad por saber qué hará con esto:

Socket socket = [some socket]; socket.setTcpNoDelay(true); OutputStream out = socket.getOutputStream(); out.write(byteArray1); out.write(byteArray2); out.write(byteArray3); out.flush();

Traté de encontrar lo que realmente funciona en un SocketOutputStream , pero por lo que sé ahora, no hace nada. Esperaba que dijera a la toma "envíe todos sus datos almacenados en el búfer AHORA", pero, desafortunadamente, no, no.

Mi pregunta es: ¿estas matrices de 3 bytes se envían en un paquete? Sé que no tienes mucho control sobre cómo TCP construye un paquete de red, pero ¿hay alguna manera de decirle al socket que (al menos intente) empaquetar estas matrices de bytes, para evitar la sobrecarga de la red? ¿Podría empaquetar manualmente las matrices de bytes y enviarlas en una sola llamada para write ayuda?


¿Podría empaquetar manualmente las matrices de bytes y enviarlas en una sola llamada para escribir ayuda?

Sí, envíelos a todos en una sola llamada para escribir. Esto maximizará las posibilidades de que sus bytes se envíen en un solo paquete.

Por supuesto, nunca se puede saber, ya que hay demasiadas variables involucradas: diferentes sistemas operativos y muchos equipos de red diferentes entre usted y su compañero, pero si le da al sistema operativo la capacidad de empacar todo, generalmente lo intentará.

Si desactiva Nagle y realiza llamadas al sistema por separado (recuerde, el sistema operativo controla los sockets, no su aplicación o Java), le está pidiendo al sistema operativo que los envíe individualmente. El sistema operativo no tiene idea de que va a llamar nuevamente a escribir con más datos.


Mi pregunta es: ¿estas matrices de 3 bytes se envían en un paquete?

Como ha desactivado el algoritmo Nagle, casi seguro que no, pero no puede estar 100% seguro.

Sé que no tienes mucho control sobre cómo TCP construye un paquete de red, pero ¿hay alguna manera de decirle al socket que (al menos intente) empaquetar estos conjuntos de bytes?

Sí. No desactive el algoritmo Nagle.

por lo que se evita la sobrecarga de la red? ¿Podría empaquetar manualmente las matrices de bytes y enviarlas en una sola llamada para escribir ayuda?

Sí, o simplemente simplemente envuelva el flujo de salida de socket en un BufferedOutputStream y llame a flush() cuando desee que se envíen los datos, de acuerdo con su código actual. Tiene razón en que flush() no hace nada en un flujo de salida de socket, pero vacía un BufferedOutputStream.