web-dev-qa-db-fra.com

ConnectionTimeout et SocketTimeout

J'ai un problème avec une bibliothèque que j'utilise. C'est peut-être la bibliothèque ou c'est peut-être moi qui l'utilise mal!

Fondamentalement, quand je fais cela (délai d'expiration en millisecondes)

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

Aucune exception de délai d'attente n'est générée et cela fonctionne bien, cependant, lorsque je fais ce qui suit,

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

Je reçois une exception Socket.

Ma question est donc la suivante: pourquoi ne puis-je pas simuler une exception de connexion? Est-ce que je comprends mal la différence entre un socket et un délai de connexion? La bibliothèque est ici (pas encore officiellement publiée).

116
Robert

Un délai de connexion se produit uniquement au démarrage de la connexion TCP. Cela se produit généralement si la machine distante ne répond pas. Cela signifie que le serveur a été arrêté, vous avez utilisé le nom IP/DNS incorrect, le mauvais port ou la connexion réseau au serveur est interrompue.

Un socket timeout est dédié à la surveillance du flux de données entrant en continu. Si le flux de données est interrompu pendant le délai spécifié, la connexion est considérée comme bloquée/interrompue. Bien sûr, cela ne fonctionne qu'avec des connexions où les données sont reçues tout le temps.

Si vous définissez timeout socket sur 1, cela signifie que chaque milliseconde de nouvelles données est reçue (en supposant que vous lisiez le bloc de données et que le bloc soit suffisamment grand)!

Si seul le flux entrant se bloque pendant plus d'une milliseconde, vous êtes sur le point d'expirer.

203
Robert

Un délai de connexion est la durée maximale pendant laquelle le programme est prêt à attendre pour établir une connexion à un autre processus. Vous n'obtenez ni ne publiez aucune donnée d'application à ce stade, vous établissez simplement la connexion elle-même.

A socket timeout est le délai d'attente pour l'attente de paquets individuels. On croit souvent à tort qu'un délai d'attente de socket est le délai d'attente pour recevoir la réponse complète. Donc, si vous avez un délai d'attente de 1 seconde pour le socket et une réponse composée de 3 paquets IP, où il faut 0,9 seconde à chaque paquet de réponse pour un temps de réponse total de 2,7 secondes, il n'y aura pas de délai d'expiration.

68
entpnerd