1) Quelle est la différence entre la connexion et le délai de lecture pour les sockets?
Le délai d'expiration de la connexion correspond au délai d'expiration de la connexion initiale; c'est-à-dire terminer la négociation de connexion TCP. Le délai de lecture est le délai d'attente pour lire les données 1 . Plus précisément, si le serveur ne parvient pas à envoyer un octet <timeout> secondes après le dernier octet, une erreur de délai de lecture sera déclenchée.
2) Que signifie le délai d'expiration de la connexion défini sur «infini»? Dans quelle situation peut-il rester dans une boucle infinitive? et qu'est-ce qui peut déclencher la mort de la boucle infinie?
Cela signifie que la tentative de connexion peut potentiellement bloquer pour toujours. Il n'y a pas de boucle infinie, mais la tentative de connexion peut être débloquée par un autre thread fermant le socket. (Un Thread.interrupt()
appel peut également faire l'affaire ... pas sûr.)
3) Que signifie le délai de lecture réglé sur «infini»? Dans quelle situation peut-il rester dans une boucle infinie? Qu'est-ce qui peut déclencher la fin de la boucle infinie?
Cela signifie qu'un appel à read
sur le flux de socket peut bloquer pour toujours. Encore une fois, il n'y a pas de boucle infinie, mais le read
peut être débloqué par un Thread.interrupt()
appel, fermant le socket, et (bien sûr) l'autre extrémité envoyant des données ou fermant la connexion.
1 - Ce n'est pas ... comme le pensait un commentateur ... le délai d'expiration de la durée pendant laquelle un socket peut être ouvert ou inactif.
HttpURLConnection.getResponseCode()
était suspendu pour apprx. une semaine avant de redémarrer le processus. Il n'y avait évidemment pas de timeout défini du côté JVM et pas de timeout du côté Linux OS.Socket.shutdownInput()
sans avoir votre main? NB Ces délais sont appliqués par TCP, pas par la JVM.