94 votes

Pourquoi une "java.net.ConnectException : Connection timed out" alors que l'URL est en service ?

Je reçois un ConnectException: Connection timed out avec une certaine fréquence de mon code. L'URL que j'essaie d'atteindre est en haut. 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 à l'obtenir.

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 votes

Veuillez marquer une réponse comme acceptée si vous avez résolu votre problème :)

3voto

NikNik Points 1165

J'ai résolu mon problème avec :

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

ou http.proxyHost ...

3voto

Lonzak Points 1408

Pourquoi le message "java.net.ConnectException : Connexion interrompue". se produit-elle lorsque l'URL est en service ?

Parce que l'URLConnection (HttpURLConnection/HttpsURLConnection) est erratique. Vous pouvez lire à ce sujet aquí y aquí . Notre solution était deux choses :

a) définir le ContentLength via setFixedLengthStreamingMode

b) attraper toute TimeoutException et réessayer si elle a échoué.

1voto

eckes Points 1191

Il peut s'agir d'un problème IPv6 (l'hôte publie une adresse IPv6 AAAA-Address et l'hôte utilisateur pense qu'il est configuré pour IPv6 mais en fait il n'est pas correctement connecté). Il peut également s'agir d'un problème de MTU du réseau, d'un blocage du pare-feu ou de la publication par l'hôte cible de différentes adresses IP (de manière aléatoire ou en fonction du pays d'origine) qui ne sont pas toutes joignables. Ou d'autres problèmes de réseau similaires.

Vous ne pouvez pas faire grand-chose à part fixer un délai d'attente et ajouter de bons messages d'erreur (notamment l'impression de l'adresse résolue des hôtes). Si vous voulez le rendre plus robuste, ajoutez la réessai, l'essai parallèle de toutes les adresses et examinez également la mise en cache de la résolution de nom (positive et négative) sur la plate-forme Java.

0voto

larsivi Points 1298

Il est possible que votre IP/hôte soit bloqué par l'hôte distant, surtout s'il pense que vous le frappez trop fort.

0voto

Damir Olejar Points 31

La raison pour laquelle cela m'est arrivé est qu'un serveur distant n'autorisait que certaines adresses IP, mais pas la sienne, et j'essayais de rendre les images à partir des URL du serveur... donc tout s'arrêtait simplement, affichant l'erreur de dépassement de temps que vous avez eue...

Assurez-vous que le serveur autorise son propre IP ou que vous effectuez le rendu à partir d'une URL distante qui existe réellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X