2010-11-04 5 views
0

je lance une connexion socket, en utilisant l'extrait suivantObliger Socket.connect attendre un moment précis avant de décider d'une connexion est indisponible

 Socket socket = new Socket(); 
     InetSocketAddress endPoint = new InetSocketAddress("localhost", 1234); 
     try 
     { 
      socket.connect(endPoint, 30000); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
      // Logging 
     } 

Le critère d'évaluation, il tente de se connecter à est déconnecté, ce Je veux faire est de tenter de se connecter et d'utiliser le délai d'attente 30000 ms, attendez pour cette période de temps avant qu'il conclut un résultat

Actuellement, ce paramètre 30000 ne semble pas être appliquée, à partir de l'horodatage lors de ma journalisation, il apparaît qu'il est déterminé dans un délai d'une seconde qu'une connexion a échoué.

Comment puis-je forcer la connexion à attendre un certain temps avant d'abandonner?

13:13:57,685 6235 DEBUG [Thread-7]  - Unable to connect to [localhost:1234] 
13:13:58,685 7235 DEBUG [Thread-7]  - Unable to connect to [localhost:1234] 
13:13:59,695 8245 DEBUG [Thread-7]  - Unable to connect to [localhost:1234] 
13:14:00,695 9245 DEBUG [Thread-7]  - Unable to connect to [localhost:1234] 

EDIT: Le API ne dit Connects this socket to the server with a specified timeout value. A timeout of zero is interpreted as an infinite timeout. The connection will then block until established or an error occurs. mais il semble que je ne suis pas l'expérience de ce type de comportement, ou ne suis pas la restauration à elle, très probablement celui-ci

Répondre

5

Ce que vous obtenez ici est correct. connect ne s'asseoira pas sur une socket en attendant qu'il voit un serveur, il tentera de se connecter et attendra une réponse. S'il n'y a rien à connecter, il revient. S'il y a quelque chose à connecter, il attendra timeout secondes pour une réponse et échouera si aucune n'est reçue.

-1

Essayez scocket.setSoTimeout (délai d'attente) avant de se connecter.

+0

Merci, j'ai essayé 'socket.setSoTimeout (30000);' avant 'socket.connect()' mais le même comportement. – Jimmy

+0

Cela définit un délai de lecture *, pas un délai de connexion. Votre réponse est incorrecte – EJP

0

Lorsque le délai d'expiration se produit, une exception SocketTimeoutException est levée que vous ne pouvez pas capturer et consigner. L'exception IOException est déclenchée lorsqu'une "erreur se produit lors de la connexion". Le délai d'expiration n'est jamais appliqué car il y a une erreur à l'avance. Edit: Juste pour clarifier: TCP/IP en tant que suite a beaucoup de spécificités qui pourraient empêcher un paquet d'atteindre son résultat souhaité (un paquet SYN/ACK). Si un ordinateur répond à votre paquet SYN en informant votre application que le port est fermé (c'est-à-dire qu'aucune application n'est en cours d'exécution/écoute), il déclenche une exception vous indiquant qu'il est impossible de se connecter à ce port. Si vous souhaitez envoyer et renvoyer des paquets SYN de toute façon en sachant qu'une application sera en ligne en écoute sur ce port, ceci est fait sur une couche réseau différente (et, autant que je sache, n'est pas accessible avec Java out -de-la-boîte).

+0

Comme l'exception est levée par la méthode connect(), elle peut également se produire lors de la connexion. – 0xCAFEBABE

+0

'SocketTimeoutException' étend' IOException', donc il l'attrape et l'enregistre. Il n'y a pas d'erreur avant. Le timeout, le refus de connexion, etc., * est * l'erreur. 'Ceci' [envoyer et renvoyer] n'est effectué sur aucune couche réseau, mais cela peut être fait par une application, y compris les applications Java. – EJP

1

Vous devez distinguer plusieurs conditions d'exception possibles.

  1. ConnectException avec le texte « connexion refusée », ce qui signifie que l'hôte était et accessible et rien n'écoutait au port. Cela arrive très rapidement et ne peut pas être soumis à un délai d'expiration.

  2. NoRouteToHostException: cela indique un problème de connectivité. Encore une fois, cela arrive immédiatement et ne peut pas être soumis à un délai d'attente.

  3. UnknownHostException: les noms d'hôte ne peuvent pas être résolus via DNS. Cela arrive immédiatement, ou plutôt après un délai DNS généralement court, et ne peut pas être soumis à un timeout.

  4. ConnectException avec tout autre texte: cela peut indiquer une absence de réponse du système cible. Se produit généralement lorsque des pare-feu sont présents. Peut être soumis à un délai d'attente.

Vous faites la bonne chose en appelant Socket.connect() avec un paramètre de délai d'attente. Si vous ne le faites pas, ou si vous spécifiez un délai d'attente nul, le délai d'attente système par défaut est utilisé, qui est de l'ordre de 60 à 75 secondes selon la plate-forme. Ceci est contraire à la déclaration de Javadoc sur un 'timeout infini', ce qui n'est pas correct. En outre, vous ne pouvez pas augmenter le délai d'attente au-delà de cette limite via Socket.connect() avec un paramètre de délai d'expiration. Vous pouvez également utiliser les canaux de socket java.nio en mode non bloquant avec un select() pour administrer le délai d'attente, mais vous ne pouvez toujours pas augmenter le délai d'attente au-delà de la valeur par défaut de la plateforme via cette méthode ou toute autre méthode.

Questions connexes