248 votes

Quelle est la différence entre la connexion et le délai d'attente pour les sockets?

3 questions:

  1. Quelle est la différence entre la connexion et la lecture délai d'attente pour les sockets?

  2. Ce n' connexion le délai défini à "l'infini"? Dans quelle situation peut-elle rester dans un infinitif boucle? et ce qui peut déclencher qu'à l'infini-boucle meurt?

  3. Ce n' lire le délai défini à "l'infini"? Dans quelle situation peut-elle rester dans un infinitif boucle? et ce qui peut déclencher qu'à l'infini-boucle meurt?

305voto

Stephen C Points 255558

1) Quelle est la différence entre la connexion et le délai d'attente pour les sockets?

Le délai de connexion est le délai d'attente dans la prise de raccordement initial; c'est à dire terminer la connexion TCP handshake. Le délai d'attente est le délai d'attente pour lire les données. Plus précisément, si le serveur ne parvient pas à envoyer un octet <timeout> secondes après le dernier octet, un délai d'attente d'erreur sera générée.

2) Quel est le délai d'attente fixé à "l'infini"? Dans quelle situation peut-elle rester dans un infinitif boucle? et ce qui peut déclencher qu'à l'infini-boucle meurt?

Cela signifie que la tentative de connexion peut potentiellement bloquer pour toujours. Il n'y a pas de boucle infinie, mais de la tentative de connexion peut être débloqué par un autre thread de la fermeture de la socket. ( Thread.interrupt() Appel peut aussi faire l'affaire ... pas sûr.)

3) Quel est le délai d'attente fixé à "l'infini"? Dans quelle situation peut-elle rester dans un infinitif boucle? et ce qui peut déclencher qu'à l'infini-boucle meurt?

Cela signifie qu'un appel à l' read sur le socket stream peut bloquer pour toujours. Encore une fois, il n'y a pas de boucle infinie, mais l' read peut être débloqué par un Thread.interrupt() appel, la fermeture de la socket, et (bien sûr) à l'autre extrémité de l'envoi de données ou de la fermeture de la connexion.

12voto

ZZ Coder Points 36990

Ce sont des valeurs de délai d'expiration forcée par la JVM pour l'établissement de la connexion TCP et est en attente de la lecture des données à partir de socket.

Si la valeur est réglée sur l'infini, vous ne serez pas attendre éternellement. Cela signifie simplement JVM n'a pas de délai d'attente et le système d'exploitation sera responsable de tous les délais d'attente. Cependant, les délais d'attente sur le système d'exploitation peut être très long. Sur certains réseaux lents, j'ai vu des délais d'attente aussi longtemps que 6 minutes.

Même si vous définissez la valeur de délai d'expiration pour la prise, il peut ne pas fonctionner si le délai d'attente se produit dans le code natif. On peut reproduire le problème sur Linux par la connexion à un hôte bloqué par le pare-feu ou de débrancher le câble sur l'interrupteur.

La seule approche pour gérer timeout TCP est d'exécuter le code de connexion dans un thread différent, et d'interrompre le fil quand il prend trop de temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X