it-swarm-eu.dev

Warum tritt die Ausnahme "Java.net.ConnectException: Zeitüberschreitung der Verbindung" auf, wenn die URL aktiv ist?

Ich bekomme einen ConnectException: Connection timed out mit einiger Häufigkeit von meinem Code. Die URL, die ich zu finden versuche, ist oben. Derselbe Code funktioniert für einige Benutzer, jedoch nicht für andere. Es scheint, als wenn ein Benutzer diese Ausnahme erhält, er die Ausnahme weiterhin erhält.

Hier ist der Stack-Trace:

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)

Hier ist ein Ausschnitt aus meinem 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

Verbindungszeitüberschreitungen (vorausgesetzt ein lokales Netzwerk und mehrere Client-Computer) resultieren normalerweise aus

a) eine Art Firewall auf dem Weg, die die Pakete einfach auffrisst, ohne dem Absender Dinge wie "No Route to Host" mitzuteilen

b) Paketverlust aufgrund falscher Netzwerkkonfiguration oder Leitungsüberlastung

c) zu viele Anforderungen, die den Server überlasten

d) eine kleine Anzahl gleichzeitig verfügbarer Threads/Prozesse auf dem Server, was dazu führt, dass alle von ihnen genutzt werden. Dies geschieht insbesondere bei Anforderungen, deren Ausführung viel Zeit in Anspruch nimmt und möglicherweise mit c) kombiniert wird.

Hoffe das hilft.

77
Jumpy

Wenn die URL im Webbrowser auf demselben Computer einwandfrei funktioniert, kann es sein, dass der Java-Code nicht den HTTP-Proxy verwendet, den der Browser für die Verbindung mit der URL verwendet.

29
Alexander

Ich würde empfehlen, die Timeout-Zeit für die Verbindung zu erhöhen, bevor der Ausgabestrom abgerufen wird.

urlConnection.setConnectTimeout(1000);

Dabei ist 1000 in Millisekunden (1000 Millisekunden = 1 Sekunde).

5
Powerlord

Die Fehlermeldung sagt alles: Ihre Verbindung ist abgelaufen. Dies bedeutet, dass Ihre Anfrage nicht innerhalb eines (Standard-) Zeitrahmens eine Antwort erhalten hat. Die Gründe, warum keine Antwort eingegangen ist, sind wahrscheinlich folgende:

a) Die IP/Domäne oder der Port ist falsch

b) Die IP/Domäne oder der Port (d. h. der Dienst) ist inaktiv

c) Die IP-Adresse/Domäne dauert länger als Ihre Standardzeit, um zu antworten

d) Sie haben eine Firewall, die Anfragen oder Antworten für jeden verwendeten Port blockiert

e) Sie haben eine Firewall, die Anforderungen an diesen bestimmten Host blockiert

f) Ihr Internetzugang ist inaktiv

g) Ihr Live-Server ist im Fall eines "Rest-API-Aufrufs" inaktiv.

Beachten Sie, dass Ihr ISP möglicherweise Firewalls und Port- oder IP-Sperren installiert hat

4
M Hamza Javed
  • versuchen Sie, das Telnet auszuführen, um ein Firewall-Problem zu sehen
  • tracert/traceroute ausführen, um die Anzahl der Hops zu ermitteln
3

Ich habe mein Problem gelöst mit:

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

oder http.proxyHost...

2
NikNik

Dies kann ein IPv6-Problem sein (der Host veröffentlicht eine IPv6-AAAA-Adresse und der Benutzerhost glaubt, dass er für IPv6 konfiguriert ist, aber tatsächlich nicht richtig verbunden ist). Dies kann auch ein Netzwerk-MTU-Problem sein, ein Firewall-Block, oder der Zielhost veröffentlicht möglicherweise andere IP-Adressen (nach dem Zufallsprinzip oder nach Herkunftsland), die nicht alle erreichbar sind. Oder ähnliche Netzwerkprobleme.

Sie können nicht viel tun, außer ein Timeout einzustellen und gute Fehlernachrichten hinzuzufügen (insbesondere die aufgelöste Adresse der Hosts auszudrucken). Wenn Sie es robuster machen möchten, fügen Sie erneut Versuche hinzu, versuchen Sie parallel, alle Adressen zu überprüfen und auch die Zwischenspeicherung von Namensauflösung (positiv und negativ) auf der Java-Plattform zu überprüfen.

1
eckes

Es besteht die Möglichkeit, dass Ihr IP/Host vom Remote-Host blockiert wird, insbesondere wenn er der Meinung ist, dass Sie ihn zu stark treffen.

0
larsivi

Der Grund, weshalb mir dies passierte, war, dass ein Remote-Server nur bestimmte IP-Adressen zuließ, jedoch keine eigene, und ich versuchte, die Bilder von den URLs des Servers zu rendern. Also würde alles stehen bleiben und der Timeout-Fehler angezeigt hätten... 

Stellen Sie sicher, dass entweder der Server seine eigene IP-Adresse zulässt oder dass Sie Dinge von einer tatsächlich vorhandenen Remote-URL rendern.

0
Damir Olejar