Waarom zou een uitzondering “java.net.ConnectException: Time-out verbinding” optreden als de URL actief is?

Ik krijg een ConnectException: Connection timed outmet een bepaalde frequentie van mijn code. De URL die ik probeer te bereiken is up. Dezelfde code werkt voor sommige gebruikers, maar niet voor anderen. Het lijkt erop dat zodra een gebruiker deze uitzondering begint te krijgen, ze de uitzondering blijven krijgen.

Hier is de stacktracering:

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 is een fragment uit mijn 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);
}

Antwoord 1, autoriteit 100%

Verbindingstime-outs (uitgaande van een lokaal netwerk en meerdere clientcomputers) zijn meestal het gevolg van

a) een soort firewall onderweg die de pakketten gewoon opeet zonder de afzender dingen te vertellen als “Geen route naar host”

b) pakketverlies door verkeerde netwerkconfiguratie of lijnoverbelasting

c) te veel verzoeken die de server overbelasten

d) een klein aantal gelijktijdig beschikbare threads/processen op de server waardoor ze allemaal worden gebruikt. Dit gebeurt vooral bij verzoeken die lang duren om te worden uitgevoerd en die kunnen worden gecombineerd met c).

Hopelijk helpt dit.


Antwoord 2, autoriteit 38%

Als de URL goed werkt in de webbrowser op dezelfde computer, kan het zijn dat de Java-code niet de HTTP-proxy gebruikt die de browser gebruikt om verbinding te maken met de URL.


Antwoord 3, autoriteit 7%

Het foutbericht zegt het allemaal: uw verbinding is verlopen. Dit betekent dat uw verzoek geen reactie heeft gehad binnen enkele (standaard) tijdsbestek. De redenen waar geen reactie is ontvangen, is waarschijnlijk een van:

a) Het IP / DOMEIN of POORT is onjuist

b) Het IP / domein of poort (I.E-service) is down

C) Het IP / domein duurt langer dan uw standaard time-out om

te reageren

D) U hebt een firewall die verzoeken of antwoorden op welke poort u gebruikt

E) U hebt een firewall die verzoeken aan die specifieke host blokkeert

F) Uw internettoegang is ingeschakeld

g) Uw live-server is omlaag. I.E in het geval van “rust-API CALL”.

Merk op dat firewalls en poort of IP-blokkering op zijn plaats kunnen zijn door uw ISP


Antwoord 4, Autoriteit 5%

Ik raad aan om de tijd van de verbinding te verhogen voordat u de uitvoerstroom krijgt, zoals SO:

urlConnection.setConnectTimeout(1000);

waar 1000 in milliseconden is (1000 milliseconden = 1 seconde).


Antwoord 5, Autoriteit 5%

  • Probeer de Telnet te doen om een ​​firewall-probleem te zien
  • Voer tracert/ tracerouteom het aantal hops
  • te vinden


Antwoord 6, Autoriteit 3%

Ik heb mijn probleem opgelost met:

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

of http.proxyHost


Antwoord 7

Dit kan een IPv6-probleem zijn (de host publiceert een IPv6 AAAA-adres en de host van de gebruiker denkt dat het is geconfigureerd voor IPv6, maar is in feite niet correct aangesloten). Dit kan ook een netwerk-MTU-probleem zijn, een firewallblokkering, of de doelhost publiceert mogelijk verschillende IP-adressen (willekeurig of op basis van het land van herkomst) die niet allemaal bereikbaar zijn. Of soortgelijke netwerkproblemen.

Je kunt niet veel doen behalve een time-out instellen en goede foutmeldingen toevoegen (vooral het opgeloste adres van de hosts afdrukken). Als u het robuuster wilt maken, voegt u het opnieuw toe, probeert u alle adressen parallel en kijkt u ook naar caching van naamomzetting (positief en negatief) op het Java-platform.


Antwoord 8

Waarom zou een “java.net.ConnectException: Time-out verbinding”
uitzondering optreden wanneer de URL up is?

Omdat de URLConnection (HttpURLConnection/HttpsURLConnection) onregelmatig is. U kunt hierover hieren hierlezen een>.
Onze oplossing bestond uit twee dingen:

a) stel de ContentLength in via setFixedLengthStreamingMode

b) vang een TimeoutException en probeer het opnieuw als het is mislukt.


Antwoord 9

Het is mogelijk dat uw IP/host wordt geblokkeerd door de externe host, vooral als deze denkt dat u het te hard aanpakt.


Antwoord 10

De reden waarom dit mij overkwam, was dat een externe server alleen bepaalde IP-adressen toestond, maar niet zijn eigen, en ik probeerde de afbeeldingen van de URL’s van de server weer te geven… zodat alles gewoon stopte en de time-out weergeeft fout die je had…

Zorg ervoor dat de server zijn eigen IP toestaat, of dat je dingen weergeeft van een externe URL die echt bestaat.

Other episodes