web-dev-qa-db-fra.com

Pourquoi une exception "Java.net.ConnectException: Connection expiré" se produit-elle lorsque l'URL est active?

Je reçois un ConnectException: Connection timed out avec une certaine fréquence de mon code. L'URL que j'essaye de taper 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 à 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);
}
79
Sarah Haskins

Les délais de connexion (en supposant un réseau local et plusieurs ordinateurs clients) résultent généralement de

a) une sorte de pare-feu sur le chemin qui mange simplement les paquets sans dire à l'expéditeur des choses comme "Pas de route à héberger"

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

c) trop de requêtes surchargeant le serveur

d) un petit nombre de threads/processus disponibles simultanément sur le serveur, ce qui entraîne leur prise en compte. Cela se produit surtout avec les demandes qui prennent beaucoup de temps et peuvent être combinées avec c).

J'espère que cela t'aides.

77
Jumpy

Si l'URL fonctionne correctement dans le navigateur Web sur le même ordinateur, il est possible que le code Java n'utilise pas le proxy HTTP utilisé par le navigateur pour se connecter à l'URL.

29
Alexander

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

urlConnection.setConnectTimeout(1000);

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

5
Powerlord

Le message d'erreur dit tout: votre connexion a expiré. Cela signifie que votre demande n'a pas reçu de réponse dans un délai (par défaut). Les raisons pour lesquelles aucune réponse n'a été reçue sont probablement l'une des suivantes:

a) L'IP/domaine ou le port est incorrect

b) L'IP/domaine ou le port (i.e service) est en panne

c) L'adresse IP/domaine prend plus de temps 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 le port que vous utilisez

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

f) Votre accès internet est en panne

g) Votre serveur live est en panne, c’est-à-dire en cas d’appel "rest-API".

Notez que des pare-feu et un blocage de port ou d’IP peuvent être en place chez votre FAI

4
M Hamza Javed
  • essayez de faire le Telnet pour voir tout problème de pare-feu
  • effectuez tracert/traceroute pour trouver le nombre de sauts
3
shahbaz sikander

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

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

ou http.proxyHost...

2
NikNik

Cela peut être un problème IPv6 (l'hôte publie une adresse IPv6 AAAA et l'hôte de l'utilisateur pense qu'il est configuré pour IPv6 mais en réalité, il n'est pas correctement connecté). Il peut également s'agir d'un problème de MTU sur le réseau, d'un bloc de pare-feu ou de l'hôte cible peut publier différentes adresses IP (de manière aléatoire ou en fonction du pays de l'auteur) qui ne sont pas toutes accessibles. Ou des problèmes de réseau similaires.

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’affichage de l’adresse résolue des hôtes). Si vous voulez le rendre plus robuste, ajoutez de nouvelles tentatives, essayez en parallèle toutes les adresses et examinez également la mise en cache de résolution de nom (positive et négative) sur la plate-forme Java.

1
eckes

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

0
larsivi

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 restituer les images à partir des URL du serveur ... eu... 

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

0
Damir Olejar