J'ai une application Java avec trois threads qui ouvrent chacun une socket et se connectent à un serveur sur différents ports. J'ai défini so_timeout sur chacune de ces sockets après l'établissement de la connexion au serveur. Ensuite, le bloc de threads attend en lecture(). Un seul des threads expire après 20 secondes (ce qui correspond au délai d'attente défini). Les deux autres ignorent le délai d'expiration. Est-il possible que la couche TCP ne gère qu'un seul délai d'attente à la fois? Y a-t-il une autre explication?setSoTimeout sur un socket client n'affecte pas le socket
2
A
Répondre
2
Le documentation dit:
L'option doit être activée avant d'entrer dans l'opération de blocage à effet.
peut-être vous devriez le mettre avant la connexion au serveur est établie, au moins avant d'appeler read() sur la prise.
Mais difficile à dire sans le code ...
3
J'ai eu plusieurs problèmes dans le passé avec SO_TIMEOUT dans Windows. Je crois que le réglage est "supposé" pour définir l'implémentation de socket sous-jacente qui pourrait dépendre du système d'exploitation et entrer en conflit avec les paramètres du registre et autres.
Mon conseil est de ne pas utiliser SO_TIMEOUT pour forcer une exception levée sur un timeout. Utilisez des E/S non bloquantes ou vérifiez que vous avez des octets disponibles() avant de lire().
Questions connexes
- 1. Erreur sur le programme client/serveur c: "Connect: opération de socket sur non-socket"
- 2. communication basée sur socket serveur client
- 3. Serveur de socket Java tcp avec socket client j2me
- 4. Répondre à un client de socket spécifique
- 5. Socket client lu "se fige"
- 6. Socket brut PAS d'envoi
- 7. Listener to socket at client (Android)
- 8. udpclient.close ne ferme pas toujours le socket?
- 9. Envoi de données sur le socket AF_PACKET
- 10. Application client/serveur basée sur une socket Java SSL
- 11. Configuration dynamique du client .NET via le socket
- 12. recevoir des données sur un socket python
- 13. Erreur 10035 sur un socket bloquant
- 14. Socket PHP ne fonctionne pas
- 15. Socket-Programmation
- 16. Envoyer un objet sérialisé via le socket
- 17. Java Socket Programmation
- 18. Comment utiliser un client basé sur socket avec le service WCF (net.tcp)?
- 19. Non-blocage Socket Polling vs Blocage socket
- 20. programmation Socket
- 21. C#, socket via le routeur
- 22. Missed Socket Message
- 23. Java TCP Socket reniflage
- 24. Java: la reconnexion sur un socket donne parfois une erreur
- 25. Socket étranglement parce que le client ne lit pas les données assez rapidement?
- 26. comment écrire des données sur le canal socket
- 27. Programmation de socket en Java
- 28. ioctl FIOREAD sur socket raw sous Linux
- 29. Écrire un serveur basé sur socket en Python, stratégies recommandées?
- 30. PHP à Perl Socket Communication
Veuillez poster votre code, vous pouvez avoir une erreur de logique sournoise qui ne peut pas être attrapée par votre question. – Jonathan
Appelez sock.getSoTimeout() pour vous assurer qu'il renvoie 20000. Publiez également du code. Quel système d'exploitation utilisez-vous? – Nick
est ici le code pour établir la connexion: while (! Connecté) {try { \t \t \t client = new Socket(); \t \t InetSocketAddress sa = new InetSocketAddress (serverIP, port); \t \t client.connect (sa); \t \t client.setKeepAlive (true); \t} catch (UnknownHostException e) { \t \t e.printStackTrace(); \t \t return null; \t} catch (IOException e) { \t ... \t} \t si (client.isConnected()) {// \t \t Définir le délai pour bloquer les opérations de lecture. \t \t try { \t \t \t client.setSoTimeout (délai * 1000); \t \t} catch (SocketException e) {} \t \t connected = true; \t}} – arsenalfan