2010-06-18 9 views
107

3 preguntas:¿Cuál es la diferencia entre conexión y tiempo de espera de lectura para enchufes?

  1. ¿Cuál es la diferencia entre conexión y leer tiempo de espera para tomas?

  2. ¿Qué significa conexión tiempo de espera establecido en "infinito"? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

  3. ¿Qué significa leer establecer el tiempo de espera en "infinito"? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

Respuesta

135

1) ¿Cuál es la diferencia entre la conexión y el tiempo de espera de lectura para sockets?

El tiempo de espera de conexión es el tiempo de espera para realizar la conexión inicial; es decir, completar el saludo de la conexión TCP. El tiempo de espera de lectura es el tiempo de espera agotado para leer datos. En concreto, si el servidor no puede enviar un byte < de tiempo de espera> segundos después del último byte, se elevará un error de lectura de tiempo de espera.

2) ¿Qué poner el tiempo de conexión a "infinito" significa? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

Significa que el intento de conexión puede bloquear para siempre. No existe un ciclo infinito, pero el intento de conexión se puede desbloquear mediante otro hilo que cierre el socket. (A Thread.interrupt() de llamadas también puede hacer el truco ... no estoy seguro.)

3) ¿Qué poner el tiempo de leer a "infinito" significa? ¿En qué situación puede permanecer en un bucle infinitivo? y ¿qué puede provocar que el bucle infinito muera?

Significa que una llamada a read en el flujo de socket puede bloquearse para siempre. Una vez más no hay bucle infinito, pero el read se puede desbloquear mediante una llamada Thread.interrupt(), cerrando la toma de corriente, y (por supuesto) el otro extremo el envío de datos o el cierre de la conexión.

+0

"El tiempo de espera de lectura es el tiempo de espera agotado para leer datos". ¿Escribió "ESPERANDO" para leer los datos? El tiempo de espera de lectura no es el tiempo durante el cual se puede abrir el socket. – corgrath

+0

En Java puede establecer "infinito" en la conexión y leer el tiempo de espera. Me pregunto cómo pueden suceder estas situaciones (donde estará en un bucle infinitivo). Si dice que la conexión es para el protocolo de enlace TCP, ¿cómo puede la espera ser infinitiva? ¿No están todos los paquetes en TCP anclado? – corgrath

+4

"¿El tiempo de espera de lectura no es el tiempo durante el que se puede abrir el socket?" Eso es correcto. "¿No están todos los paquetes TCP atados?" El tiempo de espera indica cuánto tiempo esperar para que el otro extremo envíe un ACUSE DE SINCRONIZACIÓN en respuesta al (los) paquete (s) SYN inicial (es). –

6

Estos son valores de tiempo impuestas por la JVM para el establecimiento de la conexión TCP y esperando en la lectura de datos de la toma.

Si el valor se establece en el infinito, que no va a esperar para siempre. Simplemente significa que JVM no tiene tiempo de espera y OS será responsable de todos los tiempos de espera. Sin embargo, los tiempos de espera en el sistema operativo pueden ser realmente largos. En una red lenta, he visto tiempos de espera de hasta 6 minutos.

Incluso si se establece el valor de tiempo de espera para el zócalo, puede que no funcione si el tiempo de espera que sucede en el código nativo. Podemos reproducir el problema en Linux conectándose a un host bloqueado por un firewall o desconectando el cable del switch.

El único método seguro para manejar el tiempo de espera TCP es ejecutar el código de conexión en un hilo diferente e interrumpir el hilo cuando se toma demasiado tiempo.

+0

"Si el valor está establecido en infinito, no esperará por siempre". Mientras no se trate de discusiones sobre el significado de "infinito", puede ocurrir que espere mucho tiempo. Teníamos un caso aquí, donde un 'HttpURLConnection.getResponseCode()' estaba colgando para apprx. una semana hasta que reiniciamos el proceso. Obviamente, no hubo tiempo de espera establecido en el lado de JVM y tampoco hubo tiempo de espera en el lado del sistema operativo Linux. –

+0

El último párrafo no es correcto. Una conexión tendrá un tiempo de espera después de aproximadamente un minuto como máximo. Un hilo separado es completamente innecesario. Ciertamente puede * leer * que se ejecuta para siempre si no hay datos. Sin embargo, el Javadoc está equivocado acerca de que el tiempo de espera de conexión predeterminado es infinito. No lo es – EJP

+1

@comeGetSome Eso no es correcto. Puede apagar el socket para la entrada. Eso hará que la lectura bloqueada se encuentre con el final de la transmisión. – EJP

Cuestiones relacionadas