it-swarm-eu.dev

Proč by výjimka "Java.net.ConnectException: Connection time out" nastala, když je adresa URL nahoru?

Dostávám ConnectException: Connection timed out s určitou frekvencí z mého kódu. URL, který se snažím zasáhnout, je nahoru. Stejný kód funguje pro některé uživatele, ale ne pro ostatní. Vypadá to, že jakmile jeden uživatel začne dostávat tuto výjimku, pokračuje v získávání výjimky.

Zde je trasování zásobníku:

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)

Zde je úryvek z mého kódu:

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

Časový limit připojení (za předpokladu, že lokální síť a několik klientských počítačů) je obvykle výsledkem

a) určitý druh firewallu na cestě, který jednoduše sníží pakety bez toho, aby sdělil odesílateli věci jako „Žádná cesta do hostitele“

b) ztráta paketů v důsledku špatné konfigurace sítě nebo přetížení linky

c) příliš mnoho požadavků přetížení serveru

d) malý počet současně dostupných podprocesů/procesů na serveru, což vede k jejich převzetí. To se děje zejména u požadavků, které mají dlouhou dobu běhu a mohou být kombinovány s c).

Snad to pomůže.

77
Jumpy

Pokud adresa URL funguje ve webovém prohlížeči na stejném počítači dobře, může se jednat o to, že kód Java nepoužívá server proxy HTTP, který prohlížeč používá pro připojení k adrese URL.

29
Alexander

Doporučil bych prodloužit časový limit připojení, než dosáhnete výstupního proudu:

urlConnection.setConnectTimeout(1000);

Kde 1000 je v milisekundách (1000 milisekund = 1 sekunda).

5
Powerlord

Chybové hlášení říká vše: vaše připojení vypršelo. To znamená, že váš požadavek nedostal odpověď v rámci nějakého (výchozího) časového rámce. Důvody, proč nebyla obdržena žádná odpověď, budou pravděpodobně:

a) IP/doména nebo port je nesprávný

b) IP/doména nebo port (tj. služba) je dolů

c) Adresa IP/doména trvá déle, než odpovídá výchozímu času

d) Máte bránu firewall, která blokuje požadavky nebo odpovědi na kterémkoli portu, který používáte

e) Máte bránu firewall, která blokuje požadavky daného hostitele

f) Přístup k internetu je vypnutý

g) Váš živý server je mimo provoz, tzn. v případě volání "rest-API".

Všimněte si, že váš poskytovatel připojení k Internetu může používat brány firewall a port nebo blokování IP adres

4
M Hamza Javed
  • pokuste se zobrazit Telnet zobrazit všechny problémy s bránou firewall
  • proveďte tracert/traceroute a vyhledejte počet Hops
3
shahbaz sikander

Problém jsem vyřešil:

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

nebo http.proxyHost...

2
NikNik

Může se jednat o problém IPv6 (Hostitel publikuje adresu IPv6 AAAA a uživatel Host si myslí, že je nakonfigurován pro protokol IPv6, ale není ve skutečnosti správně připojen). To může být také problém MTU sítě, blok brány firewall nebo cílový hostitel může publikovat různé adresy IP (náhodně nebo na základě země původců), které nejsou všechny dosažitelné. Nebo problémy se sítí.

Nemůžete dělat mnoho kromě nastavení časového limitu a přidávání dobrých chybových zpráv (zejména tisk adresy hostitelů vyřešených). Pokud chcete, aby byl robustnější, přidejte opakování, paralelní zkoušení všech adres a také prohledávání názvů v mezipaměti (pozitivní a negativní) na platformě Java.

1
eckes

Existuje možnost, že váš IP/Host je blokován vzdáleným hostitelem, zvláště pokud si myslí, že ho zasáhnete příliš tvrdě.

0
larsivi

Důvodem, proč se to stalo mně, bylo, že vzdálený server povolil pouze určité adresy IP, ale ne své vlastní, a snažil jsem se vykreslovat obrázky ze serverových adres URL ... takže všechno by se prostě zastavilo, zobrazením chyby časového limitu, kterou jste měl ... 

Ujistěte se, že server povoluje vlastní IP adresu nebo že renderujete věci z nějaké vzdálené adresy URL, která skutečně existuje.

0
Damir Olejar