it-swarm-tr.com

URL up olduğunda neden bir "Java.net.ConnectException: Bağlantı zaman aşımına uğradı" istisnası oluşuyor?

Kodumdan biraz sıklıkta bir ConnectException: Connection timed out alıyorum. Vurmaya çalıştığım URL yukarı. Aynı kod, bazı kullanıcılar için çalışır ancak diğerleri için geçerli değildir. Bir kullanıcı bu istisnayı almaya başladığında, istisnayı almaya devam ettiği anlaşılıyor.

İşte yığın izlemesi:

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 kodumun 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);
}
79
Sarah Haskins

Bağlantı zaman aşımları (yerel bir ağ ve birkaç istemci makinesi varsayarsak) tipik olarak

a) Göndericiye "Ev Sahipliği Yapacak Yol Yok" gibi şeyler söylemeden basitçe paketleri yiyen bir tür güvenlik duvarı

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

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

d) Sunucuda, hepsinin alınmasına yol açan az sayıda eşzamanlı mevcut iş parçacığı/işlem. Bu, özellikle çalışması uzun zaman alan ve c) ile birleşebilen isteklerde olur.

Bu yardımcı olur umarım.

77
Jumpy

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

29
Alexander

Çıkış akışını almadan önce bağlantı zaman aşımı süresini yükseltmenizi tavsiye ederim, şöyle:

urlConnection.setConnectTimeout(1000);

1000 milisaniyede (1000 milisaniye = 1 saniye).

5
Powerlord

Hata mesajı her şeyi söylüyor: bağlantınız zaman aşımına uğradı. Bu, isteğinizin bazı (varsayılan) zaman dilimlerinde yanıt alamadığı anlamına gelir. Yanıt alınmamasının nedenlerinden biri aşağıdakilerden biri olabilir:

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

b) IP/etki alanı veya bağlantı noktası (yani hizmet) kapalı

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

d) Kullandığınız porttaki istekleri veya cevapları engelleyen bir güvenlik duvarınız var

e) İlgili ana makineye gelen istekleri engelleyen bir güvenlik duvarınız var.

f) İnternet erişiminiz kapalı.

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

Güvenlik duvarları ve bağlantı noktası veya IP engelleme servis sağlayıcınız tarafından yerinde olabilir.

4
M Hamza Javed
  • herhangi bir güvenlik duvarı sorununu görmek için Telnet'i kullanmayı deneyin
  • atlama sayısını bulmak için tracert/traceroute gerçekleştirin
3
shahbaz sikander

Sorunumu şu şekilde çözdüm:

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

veya http.proxyHost...

2
NikNik

Bu bir IPv6 problemi olabilir (Host, bir IPv6 AAAA-Adresi yayınlar ve Host kullanıcıları IPv6 için yapılandırıldığını düşünüyor ancak aslında doğru şekilde bağlanmamıştır). Bu aynı zamanda bir ağ MTU problemi, bir güvenlik duvarı bloğu ya da hedef Ana Bilgisayar, hepsi erişilemeyen farklı IP adresleri (rastgele veya kaynakçıların ülkesine göre) yayınlayabilir. Veya similliar ağ problemleri.

Zaman aşımı ayarlamak ve iyi hata mesajları eklemek dışında pek bir şey yapamazsınız (özellikle, ana bilgisayarların çözümlenmiş adreslerini yazdırarak). Daha sağlam hale getirmek istiyorsanız, yeniden deneyin, tüm adresleri paralel olarak deneyin ve ayrıca Java platformunda ad çözümleme önbelleğe almayı (pozitif ve negatif) araştırın.

1
eckes

IP/Ana Bilgisayarınızın uzak Ana Bilgisayar tarafından engellenme olasılığı vardır, özellikle çok sert vurduğunuzu düşünüyorsa.

0
larsivi

Bunun benim başıma gelmesinin nedeni, uzaktaki bir sunucunun yalnızca IP adreslemesine izin vermekteydi, kendisinin değil, IP adreslerini görüntülemeye çalışıyordum ... ... böylece her şey durduracaktı, zaman aşımı hatasını gösterecekti. vardı... 

Sunucunun kendi IP'sine izin verdiğinden veya gerçekte varolan bazı uzak URL’lerden işlem yaptığınızdan emin olun.

0
Damir Olejar