1) ¿Cuál es la diferencia entre la conexión y el tiempo de espera de lectura para los sockets?
El tiempo de espera de conexión es el tiempo de espera para realizar la conexión inicial; es decir, completar el protocolo de enlace de conexión TCP. El tiempo de espera de lectura es el tiempo de espera al esperar para leer los datos 1 . Específicamente, si el servidor no puede enviar un byte <timeout> segundos después del último byte, se generará un error de tiempo de espera de lectura.
2) ¿Qué significa el tiempo de espera de conexión establecido en "infinito"? ¿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 bloquearse para siempre. No hay un bucle infinito, pero el intento de conexión puede ser desbloqueado por otro hilo que cierre el zócalo. (Una Thread.interrupt()
llamada también puede hacer el truco ... no estoy seguro).
3) ¿Qué significa el tiempo de espera de lectura establecido en "infinito"? ¿En qué situación puede permanecer en un bucle infinito? ¿Qué puede provocar que termine el ciclo infinito?
Significa que una llamada a read
la secuencia del socket puede bloquearse para siempre. Una vez más, no hay un bucle infinito, pero read
se puede desbloquear mediante una Thread.interrupt()
llamada, cerrando el socket y (por supuesto) el otro extremo enviando datos o cerrando la conexión.
1 - No es ... como pensaba un comentarista ... el tiempo de espera de cuánto tiempo puede estar abierto o inactivo un socket.
HttpURLConnection.getResponseCode()
se colgaba un 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.Socket.shutdownInput()
sin tener tu mano en la mano? Nota: estos tiempos de espera son impuestos por TCP, no por la JVM.