2009-08-20 6 views
2

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

+0

Veuillez poster votre code, vous pouvez avoir une erreur de logique sournoise qui ne peut pas être attrapée par votre question. – Jonathan

+0

Appelez sock.getSoTimeout() pour vous assurer qu'il renvoie 20000. Publiez également du code. Quel système d'exploitation utilisez-vous? – Nick

+0

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

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().