it-swarm-id.com

Mengapa pengecualian "Java.net.ConnectException: Connection time out" terjadi ketika URL naik?

Saya mendapatkan ConnectException: Connection timed out dengan beberapa frekuensi dari kode saya. URL yang saya coba tekan sudah habis. Kode yang sama berfungsi untuk beberapa pengguna, tetapi tidak untuk yang lain. Sepertinya sekali satu pengguna mulai mendapatkan pengecualian ini, mereka terus mendapatkan pengecualian.

Berikut ini jejak tumpukan:

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)

Ini cuplikan dari kode saya:

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

Waktu habis koneksi (dengan asumsi jaringan lokal dan beberapa mesin klien) biasanya dihasilkan dari

a) semacam firewall pada cara yang hanya memakan paket-paket tanpa memberi tahu pengirim hal-hal seperti "No Route to Host"

b) kehilangan paket karena konfigurasi jaringan yang salah atau kelebihan saluran

c) terlalu banyak permintaan yang membebani server

d) sejumlah kecil thread/proses yang tersedia secara simultan di server yang mengarah ke semuanya. Ini terjadi terutama dengan permintaan yang membutuhkan waktu lama untuk dijalankan dan dapat digabungkan dengan c).

Semoga ini membantu.

77
Jumpy

Jika URL berfungsi dengan baik di browser web pada mesin yang sama, mungkin kode Java tidak menggunakan proxy HTTP yang digunakan browser untuk menghubungkan ke URL.

29
Alexander

Saya akan merekomendasikan menaikkan batas waktu koneksi sebelum mendapatkan aliran output, seperti:

urlConnection.setConnectTimeout(1000);

Di mana 1000 dalam milidetik (1000 milidetik = 1 detik).

5
Powerlord

Pesan kesalahan mengatakan semuanya: koneksi Anda habis. Ini berarti permintaan Anda tidak mendapatkan respons dalam beberapa jangka waktu (default). Alasan mengapa tidak ada tanggapan yang diterima kemungkinan adalah salah satu dari:

a) IP/domain atau port tidak benar

b) IP/domain atau port (yaitu layanan) turun

c) IP/domain membutuhkan waktu lebih lama dari batas waktu default Anda untuk merespons

d) Anda memiliki firewall yang memblokir permintaan atau respons pada port apa pun yang Anda gunakan

e) Anda memiliki firewall yang memblokir permintaan ke Host tertentu

f) Akses internet Anda tidak aktif

g) Server langsung Anda tidak aktif jika "rest-API call".

Perhatikan bahwa firewall dan port atau pemblokiran IP mungkin dilakukan oleh ISP Anda

4
M Hamza Javed
  • coba lakukan Telnet untuk melihat masalah firewall
  • melakukan tracert/traceroute untuk menemukan jumlah Hop
3
shahbaz sikander

Saya memecahkan masalah saya dengan:

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

atau http.proxyHost ...

2
NikNik

Ini bisa menjadi masalah IPv6 (Host menerbitkan IPv6 AAAA-Address dan Host pengguna berpikir itu dikonfigurasi untuk IPv6 tetapi sebenarnya tidak terhubung dengan benar). Ini juga bisa menjadi masalah MTU jaringan, blok firewall, atau Host target mungkin mempublikasikan alamat IP yang berbeda (secara acak atau berdasarkan negara pencetus) yang tidak semuanya dapat dijangkau. Atau masalah jaringan yang serupa.

Anda tidak dapat melakukan banyak hal selain mengatur batas waktu dan menambahkan pesan kesalahan yang baik (terutama mencetak alamat yang diselesaikan tuan rumah). Jika Anda ingin membuatnya lebih kuat, tambahkan coba lagi, coba semua alamat secara paralel dan lihat juga cache resolusi nama (positif dan negatif) pada platform Java.

1
eckes

Ada kemungkinan bahwa IP/Host Anda diblokir oleh Host jarak jauh, terutama jika ia berpikir Anda memukulnya terlalu keras.

0
larsivi

Alasan mengapa ini terjadi pada saya adalah bahwa server jarak jauh hanya memungkinkan IP tertentu yang dialamatkan tetapi tidak sendiri, dan saya mencoba untuk membuat gambar dari URL server ... jadi semuanya akan berhenti, menampilkan kesalahan batas waktu yang Anda telah ... 

Pastikan server mengizinkan IP-nya sendiri, atau Anda merender hal-hal dari beberapa URL jauh yang benar-benar ada.

0
Damir Olejar