Tôi đang cố gắng để tải về một tập tin trên kết nối rất chậm theo cách này:HttpURLConnection getInputStream: timeout luôn sau 180 giây
java.net.URL url = new URL("https://X.X.X.X:8443/path/2f6b88cf2b70ee933197edfc9627a9bc/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setConnectTimeout(240 * 1000);
connection.setReadTimeout(240 * 1000);
long start = System.currentTimeMillis();
Files.copy(connection.getInputStream(), new File("test.zip").toPath());
System.out.println("Time: "+((System.currentTimeMillis() - start)/1000) + " sec.");
và tôi nhận thấy rằng đối với một số lý do (có nguồn gốc thời gian chờ cửa sổ ổ cắm?) Nó luôn luôn ngắt sau giây tải xuống mà không có bất kỳ ngoại lệ nào.
Thiết lập thời gian chờ trong setConnectTimeout (...) hoặc setReadTimeout (...) không hữu ích.
Tôi cố gắng để tải về tập tin sử dụng wget:
wget https://X.X.X.X:8443/path/2f6b88cf2b70ee933197edfc9627a9bc/ --no-check-certificate
--2015-09-07 14:36:12-- https://X.X.X.X:8443/path/2f6b88cf2b70ee933197edfc9627a9bc/
Connecting to X.X.X.X:8443... connected.
WARNING: The certificate of ‘X.X.X.X’ is not trusted.
WARNING: The certificate of ‘X.X.X.X’ hasn't got a known issuer.
The certificate's owner does not match hostname ‘X.X.X.X’
HTTP request sent, awaiting response... 302 Found
Location: https://X.X.X.X:8443/files/test.zip [following]
--2015-09-07 14:36:16-- https://X.X.X.X:8443/files/test.zip
Reusing existing connection to X.X.X.X:8443.
HTTP request sent, awaiting response... 200 OK
Length: 321917584 (307M) [application/zip]
Saving to: ‘test.zip’
test.zip 100%[====================================================================================>] 307.00M 253KB/s in 19m 50ss
tập tin hoàn chỉnh đã được cứu thành công trên đĩa sau 20 phút.
Điều gì là sai với HttpURLConnection?
Chỉnh sửa: Tôi đã cố tải xuống tệp thử nghiệm từ máy chủ khác bằng giao thức http và mọi thứ đều OK. Nó có vẻ là một vấn đề máy chủ hoặc giao thức cụ thể. Nhưng tại sao wget quản lý để tải xuống toàn bộ tệp?
Edit2: sau lời khuyên của bạn tôi cũng đã cố gắng:
- loại bỏ connection.setDoOutput (true);
- sử dụng liên kết trực tiếp để tránh chuyển hướng 302
- thay thế phương pháp Files.copy bởi thực hiện tùy chỉnh
Đáng tiếc là không ai trong số trên giúp.
Chỉnh sửa3: Tôi nhận thấy rằng tệp cũng có sẵn trên cùng một máy chủ thông qua giao thức http không an toàn. Vì vậy, tôi đã thay đổi chỉ URL trong mã của tôi và sau giây tôi nhận:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.net.www.MeteredStream.read(MeteredStream.java:134)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3066)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3060)
at java.nio.file.Files.copy(Files.java:2735)
at java.nio.file.Files.copy(Files.java:2854)
Sự hiểu biết của tôi về readTimeout là lượng thời gian chờ cho đến khi dữ liệu có sẵn. Dù sao đi nữa, họ chỉ mất vài giây, và bạn đã có 240.000 - 4 phút. – KDM
Tôi đã thử giảm cả hai thời gian chờ xuống 10 giây hoặc tăng lên 10m nhưng nó luôn bị gián đoạn sau 180 giây. –
Bạn có thể đăng toàn bộ stacktrace của ngoại lệ quan sát được không? –