2008-09-17 13 views
66

Je reçois un ConnectException: Connection timed out avec une certaine fréquence de mon code. L'URL que j'essaye d'atteindre est en hausse. Le même code fonctionne pour certains utilisateurs, mais pas pour d'autres. Il semble qu'une fois qu'un utilisateur commence à obtenir cette exception, il continue d'obtenir l'exception.Pourquoi une exception "java.net.ConnectException: Connection a expiré" se produit-elle lorsque l'URL est terminée?

Voici la trace de la pile:

java.net.ConnectException: Connection timed out 
Caused by: java.net.ConnectException: Connection timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.Socket.connect(Socket.java:516) 
    at java.net.Socket.connect(Socket.java:466) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:365) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:477) 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:214) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:287) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:299) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840) 

Voici un extrait de mon code:

URLConnection urlConnection = null; 
OutputStream outputStream = null; 
OutputStreamWriter outputStreamWriter = null; 
InputStream inputStream = null; 

try { 
    URL url = new URL(urlBase); 
    urlConnection = url.openConnection(); 
    urlConnection.setDoOutput(true); 

    outputStream = urlConnection.getOutputStream(); // exception occurs on this line 
    outputStreamWriter = new OutputStreamWriter(outputStream); 
    outputStreamWriter.write(urlString); 
    outputStreamWriter.flush(); 
    inputStream = urlConnection.getInputStream(); 
    String response = IOUtils.toString(inputStream); 
    return processResponse(urlString, urlBase, response); 
} catch (IOException e) { 
    throw new Exception("Error querying url: " + urlString, e); 
} finally { 
    IoUtil.close(inputStream); 
    IoUtil.close(outputStreamWriter); 
    IoUtil.close(outputStream); 
} 
+7

S'il vous plaît cocher une réponse comme accpeted si vous avez résolu votre problème :) – Tobias

Répondre

0

Il est possible que votre adresse IP/hôte sont bloquées par l'hôte distant, surtout si il pense que vous frappez trop fort.

67

les délais d'attente de connexion (en supposant un réseau local et plusieurs machines clientes) résultent généralement de

a) une sorte de pare-feu sur le chemin qui mange simplement les paquets sans dire les choses de l'expéditeur comme « No route to host »

b) la perte de paquets suite à une mauvaise configuration du réseau ou de surcharge de la ligne

c) un trop grand nombre de demandes surcharger le serveur

d) un petit nombre de threads disponibles simultanément/processus o n le serveur qui conduit à tous d'être pris. Cela arrive surtout avec les requêtes qui prennent beaucoup de temps à s'exécuter et peuvent se combiner avec c).

Espérons que cela aide.

+4

(d) est juste un cas particulier de (c). – EJP

29

Si l'URL fonctionne correctement dans le navigateur Web de la même machine, il se peut que le code Java n'utilise pas le proxy HTTP utilisé par le navigateur pour se connecter à l'URL.

6

Je recommande augmenter le temps de délai de connexion avant d'obtenir le flux de sortie, comme ceci:

urlConnection.setConnectTimeout(1000); 

Où 1000 est en millisecondes (1000 millisecondes = 1 seconde).

+12

Ça ne l'augmente pas, ça l'abaisse drastiquement. Par défaut, il s'agit d'environ une minute, et vous ne pouvez pas l'augmenter, vous pouvez seulement l'abaisser. – EJP

3
  • essayer de faire Telnet pour voir tout problème de pare-feu
  • effectuer tracert/traceroute pour trouver nombre de sauts
1

Cela peut être un problème IPv6 (l'hôte publie un IPv6 AAAA-Adresse et l'hôte des utilisateurs pense qu'il est configuré pour IPv6 mais il n'est pas correctement connecté). Cela peut également être un problème de MTU réseau, un bloc de pare-feu ou l'hôte cible peut publier différentes adresses IP (au hasard ou en fonction du pays d'origine) qui ne sont pas toutes accessibles. Ou des problèmes de réseau similliar.

Vous ne pouvez pas faire grand chose en plus de définir un délai d'attente et d'ajouter de bons messages d'erreur (en particulier l'impression de l'adresse résolue des hôtes). Si vous voulez le rendre plus robuste, ajoutez réessayer, essayez toutes les adresses en parallèle et regardez aussi la mise en cache de la résolution de noms (positive et négative) sur la plate-forme Java.

0

La raison pour laquelle cela m'est arrivé était qu'un serveur distant autorisait uniquement certaines adresses IP adressées mais pas les siennes, et j'essayais de rendre les images à partir des URL du serveur ... tout s'arrêtait donc, affichant le erreur de délai d'attente que vous avez eu ...

Assurez-vous que le serveur autorise sa propre adresse IP ou que vous restituez des éléments à partir d'une URL distante qui existe réellement.

2

Le message d'erreur indique tout: votre connexion a expiré. Cela signifie que votre demande n'a pas reçu de réponse dans certains délais (par défaut). Les raisons pour lesquelles aucune réponse n'a été reçue est susceptible d'être l'un des:

a) IP/domaine ou le port est incorrect

b) IP/domaine ou le port (ie le service) est en baisse

c) Le IP/domaine est plus long que votre délai d'attente par défaut pour répondre

d) vous avez un pare-feu qui bloque les demandes ou les réponses sur tout port que vous utilisez

e) vous avez un pare-feu qui bloque demandes à cet hôte particulier

f) Votre accès Internet est en baisse

g) Votre live serveur est en panne i.e. en cas de "appel reste-API".

Notez que les pare-feu et le port ou le blocage IP peuvent être mises en place par votre fournisseur d'accès Internet

0

Je résolu mon problème avec:

System.setProperty("https.proxyHost", "myProxy"); 
System.setProperty("https.proxyPort", "80"); 

ou http.proxyHost ...

Questions connexes