Tại sao ngoại lệ “java.net.ConnectException: Kết nối đã hết thời gian chờ” lại xảy ra khi URL lên?


86

Tôi nhận được một ConnectException: Connection timed outsố tần suất từ ​​mã của mình. URL tôi đang cố gắng truy cập đã lên. Mã tương tự hoạt động đối với một số người dùng, nhưng không hoạt động với những người khác. Có vẻ như khi một người dùng bắt đầu nhận được ngoại lệ này, họ tiếp tục nhận được ngoại lệ.

Đây là dấu vết ngăn xếp:

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)

Đây là một đoạn mã từ mã của tôi:

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
Vui lòng đánh dấu một câu trả lời như accpeted nếu bạn đã giải quyết vấn đề của bạn :)
Tobias

Câu trả lời:


84

Thời gian chờ kết nối (giả sử một mạng cục bộ và một số máy khách) thường là do

a) một số loại tường lửa trên đường chỉ đơn giản là ăn các gói mà không thông báo cho người gửi những điều như "Không có đường dẫn đến máy chủ"

b) mất gói do cấu hình mạng sai hoặc quá tải đường truyền

c) quá nhiều yêu cầu làm quá tải máy chủ

d) một số lượng nhỏ các luồng / quy trình có sẵn đồng thời trên máy chủ dẫn đến việc tất cả chúng đều được thực hiện. Điều này đặc biệt xảy ra với các yêu cầu mất nhiều thời gian để chạy và có thể kết hợp với c).

Hi vọng điêu nay co ich.


Điều đã giúp tôi gỡ lỗi vấn đề này là ping đến máy chủ mà tôi đang thực hiện yêu cầu. Tôi phát hiện ra URL được phân giải thành IP công cộng, thay vì IP riêng mà tôi dự định. Một ánh xạ mới trong tệp / etc / hosts được phép để khắc phục sự cố. Tôi thêm nhận xét đề phòng người khác gặp phải vấn đề tương tự.
Bouramas

31

Nếu URL hoạt động tốt trong trình duyệt web trên cùng một máy, thì có thể mã Java không sử dụng proxy HTTP mà trình duyệt đang sử dụng để kết nối với URL.


6

Thông báo lỗi nói lên tất cả: kết nối của bạn đã hết thời gian chờ. Điều này có nghĩa là yêu cầu của bạn không nhận được phản hồi trong một khung thời gian (mặc định) nào đó. Các lý do mà không nhận được phản hồi có thể là một trong những lý do:

a) IP / miền hoặc cổng không chính xác

b) IP / miền hoặc cổng (tức là dịch vụ) bị lỗi

c) IP / miền mất nhiều thời gian hơn thời gian chờ mặc định của bạn để phản hồi

d) Bạn có một bức tường lửa đang chặn các yêu cầu hoặc phản hồi trên bất kỳ cổng nào bạn đang sử dụng

e) Bạn có tường lửa đang chặn các yêu cầu đến máy chủ cụ thể đó

f) Truy cập internet của bạn bị gián đoạn

g) Máy chủ trực tiếp của bạn không hoạt động, tức là trong trường hợp "lệnh gọi API nghỉ".

Lưu ý rằng ISP của bạn có thể đặt tường lửa và chặn cổng hoặc IP


4

Tôi khuyên bạn nên tăng thời gian chờ kết nối trước khi nhận luồng đầu ra, như sau:

urlConnection.setConnectTimeout(1000);

Trong đó 1000 tính bằng mili giây (1000 mili giây = 1 giây).


21
Đó không phải là nâng cao, đó là hạ thấp nó, một cách quyết liệt. Theo mặc định, nó là khoảng một phút, và bạn không thể tăng nó, bạn chỉ có thể hạ nó xuống.
Marquis of Lorne,

3
  • thử thực hiện Telnet để xem bất kỳ sự cố tường lửa nào
  • thực hiện tracert/ tracerouteđể tìm số bước nhảy

theo dõi đến đâu?
máy bay

rõ ràng, với bất kỳ ip nào bạn gặp lỗi.
John Lord

2

Tôi đã giải quyết vấn đề của mình với:

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

hoặc http.proxyHost...


1

Đây có thể là sự cố IPv6 (máy chủ xuất bản Địa chỉ IPv6 AAAA và máy chủ lưu trữ người dùng nghĩ rằng nó được định cấu hình cho IPv6 nhưng thực tế nó không được kết nối chính xác). Đây cũng có thể là sự cố MTU mạng, khối tường lửa hoặc máy chủ đích có thể xuất bản các địa chỉ IP khác nhau (ngẫu nhiên hoặc dựa trên quốc gia của người khởi tạo) mà không phải tất cả đều có thể truy cập được. Hoặc các vấn đề liên quan đến mạng.

Bạn không thể làm gì nhiều ngoài việc đặt thời gian chờ và thêm các thông báo lỗi tốt (đặc biệt là in ra địa chỉ đã giải quyết của máy chủ). Nếu bạn muốn làm cho nó mạnh mẽ hơn, hãy thêm thử lại, thử song song tất cả các địa chỉ và cũng xem xét bộ nhớ đệm phân giải tên (tích cực và tiêu cực) trên nền tảng Java.


1

Tại sao ngoại lệ “java.net.ConnectException: Kết nối đã hết thời gian chờ” lại xảy ra khi URL lên?

Vì URLConnection (HttpURLConnection / HttpsURLConnection) không ổn định. Bạn có thể đọc về điều này ở đâyở đây . Giải pháp của chúng tôi là hai điều:

a) đặt ContentLength qua setFixedLengthStreamingMode

b) bắt bất kỳ TimeoutException nào và thử lại nếu nó không thành công.


0

Có khả năng IP / máy chủ của bạn bị máy chủ từ xa chặn, đặc biệt nếu nó cho rằng bạn đang đánh quá mạnh.


0

Lý do tại sao điều này xảy ra với tôi là một máy chủ từ xa chỉ cho phép một số địa chỉ IP nhất định chứ không cho phép địa chỉ IP của chính nó và tôi đang cố kết xuất hình ảnh từ các URL của máy chủ ... vì vậy mọi thứ sẽ chỉ dừng lại, hiển thị lỗi thời gian chờ mà bạn đã ...

Đảm bảo rằng máy chủ đang cho phép IP của chính nó hoặc bạn đang hiển thị mọi thứ từ một số URL từ xa thực sự tồn tại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.