2011-09-09 23 views
86

Tengo un problema con una biblioteca que estoy usando, puede ser que sea la biblioteca o podría ser que yo la use incorrectamente.ConnectionTimeout versus SocketTimeout

Básicamente cuando hago esto (Tiempo de espera en milisegundos)

_ignitedHttp.setConnectionTimeout(1); // v short 
_ignitedHttp.setSocketTimeout(60000); // 60 seconds 

Sin excepción de tiempo de espera se genera trabajos bien, sin embargo, cuando hago esto:

_ignitedHttp.setConnectionTimeout(60000); // 60 seconds 
_ignitedHttp.setSocketTimeout(1);   // v short 

que obtenga una excepción del zócalo.

Así que mi pregunta es ¿por qué no puedo simular una excepción de conexión? ¿Estoy entendiendo mal la diferencia entre un socket y un tiempo de espera de conexión? La biblioteca es here (aún no se ha grabado oficialmente).

Respuesta

159

A tiempo de espera de conexión se produce solo al iniciar la conexión TCP. Esto generalmente sucede si la máquina remota no responde. Esto significa que el servidor se ha cerrado, usted usó el nombre de IP/DNS incorrecto o la conexión de red al servidor está inactiva.

A socket timeout está dedicado a supervisar el flujo continuo de datos entrantes. Si el flujo de datos se interrumpe durante el tiempo de espera especificado, la conexión se considera bloqueada/interrumpida. Por supuesto, esto solo funciona con conexiones donde se reciben datos todo el tiempo.

Al configurar el tiempo de espera del socket en 1, esto requeriría que se reciban datos nuevos de milisegundos (¡suponiendo que lea el bloque de datos correctamente y el bloque sea lo suficientemente grande)!

Si solo la transmisión entrante se detiene durante más de un milisegundo, se está produciendo un tiempo de espera excedido.

+1

¿Alguna vez podría obtener un tiempo de espera de conexión si el servidor no está inactivo pero está ocupado? ¿O sería un tiempo de espera de socket? – Robert

+7

Eso depende: si la conexión TCP se ha establecido antes de que el servidor esté sobrecargado, obtendrá una excepción de socket; de lo contrario, obtendrá una excepción de conexión que indica que no se pudo establecer la conexión TCP. – Robert

+0

Además, ¿cuáles son los valores típicos del tiempo de espera del socket y el tiempo de espera de conexión para dispositivos móviles? ¿Uno es generalmente más grande que el otro? – Robert

42

A tiempo de espera de conexión es la cantidad máxima de tiempo que el programa está dispuesto a esperar para configurar una conexión a otro proceso. En este punto, no está recibiendo ni publicando datos de aplicaciones, solo establece la conexión.

A tiempo de espera de socket es el tiempo de espera cuando se esperan paquetes individuales. Es un concepto erróneo común que un tiempo de espera de socket es el tiempo de espera para recibir la respuesta completa. Por lo tanto, si tiene un tiempo de espera de socket de 1 segundo y una respuesta compuesta por 3 paquetes IP, donde cada paquete de respuesta tarda 0,9 segundos en llegar, con un tiempo total de respuesta de 2.7 segundos, no habrá tiempo de espera.

+0

Bien. 1. Entonces, ¿podemos decir que SocketTimeout solo aparece en la imagen cuando una conexión ya está establecida? 2. ¿Qué sucede si no hay flujo de datos para, por ejemplo, 5 minutos después de que se hayan recibido los 3 paquetes? ¿Habrá una excepción SocketTimeout después de que se haya recibido el tercer paquete? –

+0

@SaurabhPatil 1. Sí. Consulte [Descripción técnica general de la tecnología del protocolo HTTP] (https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Technical_overview) para confirmación. 2. Una vez que se envía el final del mensaje, no se necesitan más datos, por lo que no se producirá un tiempo de espera del socket. Ver [esta respuesta] (https://stackoverflow.com/a/4824738/4851565) sobre el tema. – entpnerd