URL açıkken neden bir "java.net.ConnectException: Bağlantı zaman aşımına uğradı" istisnası oluşur?


87

Kodumdan bir ConnectException: Connection timed outfrekans alıyorum . Vurmaya çalıştığım URL yükseldi. Aynı kod bazı kullanıcılar için işe yararken diğerleri için geçerli değildir. Görünüşe göre bir kullanıcı bu istisnayı almaya başladığında istisnayı almaya devam ediyor.

İşte yığın izleme:

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)

İşte kodumdan bir pasaj:

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
Sorununuzu çözdüyseniz lütfen bir yanıtı onaylandı olarak işaretleyin :)
Tobias

Yanıtlar:


85

Bağlantı zaman aşımları (yerel bir ağ ve birkaç istemci makine varsayılarak) genellikle aşağıdakilerden kaynaklanır:

a) "Barındırmak için Rota Yok" gibi şeyleri gönderene söylemeden paketleri basitçe yiyen bir tür güvenlik duvarı

b) Yanlış ağ yapılandırması veya hat aşırı yüklemesi nedeniyle paket kaybı

c) sunucuyu aşırı yükleyen çok fazla istek

d) hepsinin alınmasına yol açan, sunucuda aynı anda kullanılabilen az sayıda iş parçacığı / işlem. Bu, özellikle çalıştırılması uzun süren ve c) ile birleşebilen isteklerde olur.

Bu yardımcı olur umarım.


Bu sorunu gidermeme yardımcı olan şey, istekte bulunduğum sunucuya ping atmaktı. Hedeflediğim özel IP yerine URL'nin genel IP'ye çözüldüğünü öğrendim. / Etc / hosts dosyasında yeni bir eşleme sorunu düzeltmeye izin verdi. Başka birinin benzer bir sorunla karşılaşması ihtimaline karşı yorumu ekliyorum.
Bouramas

32

URL aynı makinedeki web tarayıcısında düzgün çalışıyorsa, Java kodu tarayıcının URL'ye bağlanmak için kullandığı HTTP proxy'sini kullanmıyor olabilir.


6

Hata mesajı her şeyi söylüyor: bağlantınız zaman aşımına uğradı. Bu, isteğinizin bazı (varsayılan) zaman dilimleri içinde yanıt alamadığı anlamına gelir. Yanıt alınmamasının nedenleri büyük olasılıkla şunlardan biridir:

a) IP / alan veya bağlantı noktası yanlış

b) IP / alan veya bağlantı noktası (yani hizmet) çalışmıyor

c) IP / etki alanının yanıt vermesi varsayılan zaman aşımınızdan daha uzun sürüyor

d) Kullandığınız bağlantı noktasında istekleri veya yanıtları engelleyen bir güvenlik duvarınız var

e) Söz konusu ana bilgisayara gelen istekleri engelleyen bir güvenlik duvarınız var

f) İnternet erişiminiz kapalı

g) Canlı sunucunuz kapalıdır, yani "rest-API çağrısı" durumunda.

Güvenlik duvarları ve bağlantı noktası veya IP engellemenin ISS'niz tarafından yerinde olabileceğini unutmayın


4

Çıkış akışını almadan önce bağlantı zaman aşımı süresini artırmanızı öneririm, örneğin:

urlConnection.setConnectTimeout(1000);

1000, milisaniye cinsindendir (1000 milisaniye = 1 saniye).


22
Bu onu yükseltmek değil, bu onu büyük ölçüde düşürüyor. Varsayılan olarak yaklaşık bir dakika olduğunu ve olamaz sadece bunu düşürebilirsiniz, artırın.
user207421

3
  • herhangi bir güvenlik duvarı sorunu görmek için Telnet yapmayı deneyin
  • gerçekleştirme tracert/ tracerouteatlama sayısını bulmak için

traceroute nereye?
uçak

Açıkçası, hatayı aldığınız ip ne olursa olsun.
John Lord

3

Sorunumu şununla çözdüm:

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

veya http.proxyHost...


1

Bu bir IPv6 sorunu olabilir (ana bilgisayar bir IPv6 AAAA Adresi yayınlar ve kullanıcı ana bilgisayarı IPv6 için yapılandırıldığını düşünür, ancak aslında doğru şekilde bağlanmamıştır). Bu aynı zamanda bir ağ MTU sorunu, bir güvenlik duvarı bloğu olabilir veya hedef ana bilgisayar, tümü erişilebilir olmayan farklı IP adresleri (rastgele veya kaynakların ülkesine göre) yayınlayabilir. Veya benzer ağ sorunları.

Bir zaman aşımı ayarlamanın ve iyi hata mesajları eklemenin (özellikle ana bilgisayarların çözülmüş adresini yazdırmanın) dışında pek bir şey yapamazsınız. Daha sağlam hale getirmek istiyorsanız, tüm adresleri yeniden deneyin, paralel olarak deneyin ve ayrıca Java platformunda ad çözümleme önbelleğine (pozitif ve negatif) bakın.


1

URL açıkken neden bir "java.net.ConnectException: Bağlantı zaman aşımına uğradı" istisnası oluşur?

Çünkü URLBağlantısı (HttpURLConnection / HttpsURLConnection) düzensizdir. Bu konuyu buradan ve buradan okuyabilirsiniz . Çözümümüz iki şeydi:

a) ContentLength ayarını setFixedLengthStreamingMode

b) herhangi bir TimeoutException'ı yakalayın ve başarısız olursa yeniden deneyin.


0

IP'nizin / ana makinenizin uzak ana bilgisayar tarafından engellenme olasılığı vardır, özellikle de çok sert vurduğunuzu düşünüyorsa.


0

Bunun benim başıma gelmesinin nedeni, uzak bir sunucunun yalnızca belirli IP adreslerine izin veriyor olmasıydı, ancak kendisinin değil ve ben de görüntüleri sunucunun URL'lerinden oluşturmaya çalışıyordum ... vardı...

Sunucunun kendi IP'sine izin verdiğinden veya gerçekte var olan bazı uzak URL'lerden bir şeyler oluşturduğunuzdan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.