2015-09-08 13 views
8

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) 
+0

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

+0

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. –

+0

Bạn có thể đăng toàn bộ stacktrace của ngoại lệ quan sát được không? –

Trả lời

2

Cuối cùng tôi đã tìm thấy giải pháp ở đây It is not possible to download large files at Jetty server (nhờ một lần nữa StackOverflow). Vấn đề ở phía máy chủ.

Cầu cảng 9.2 mà chúng tôi đã sử dụng có lỗi gián đoạn phục vụ các tệp lớn trên kết nối chậm (https://bugs.eclipse.org/bugs/show_bug.cgi?id=472621). Dường như ngoại lệ không phải lúc nào cũng bị ném.

Wget và trình duyệt bằng cách nào đó có thể hoàn tất tải xuống mặc dù đã bị trì hoãn chuyển hoặc kết nối đặt lại.Rất tiếc, ứng dụng Java của tôi nhạy cảm hơn ...

Nâng cấp cầu tàu đi kèm lên phiên bản ổn định cuối cùng 9.3.3 đã khắc phục mọi sự cố với tải xuống.

0
connection.setRequestMethod("GET"); 

Ở đây bạn đang có ý định làm một HTTP GET.

connection.setDoOutput(true); 

Tại đây bạn sẽ đổi thành PUT.

Files.copy(connection.getInputStream(), new File("test.zip").toPath()); 

Tại đây bạn sẽ nhận được luồng đầu vào mà không cần phải viết gì cả. Máy chủ vẫn đang chờ dữ liệu POST mà bạn chưa bao giờ gửi, vì vậy nó không bao giờ gửi phản hồi, vì vậy bạn đã hết thời gian chờ.

Mất dòng setDoOutput(true);.

+0

Cảm ơn câu trả lời nhưng nó không giúp ích gì. –

+0

Bạn sẽ phải trình bày những gì bạn đã làm. Chỉnh sửa nó vào câu hỏi của bạn. – EJP

Các vấn đề liên quan