2015-09-08 12 views
8

Ich versuche, eine Datei auf sehr langsame Verbindung auf diese Weise zum Download:HttpURLConnection getInputStream: Timeout immer nach 180 Sekunden

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."); 

und ich bemerkte, dass aus irgendwelchen Gründen (native Windows-Socket-Timeout?) Immer bricht nach Sekunden des Downloads ohne Ausnahmen.

Das in setConnectTimeout (...) oder setReadTimeout (...) eingestellte Timeout hilft nicht.

Ich habe versucht, diese Datei mit wget herunterladen:

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 

komplette Datei erfolgreich auf der Festplatte nach 20 Minuten gespeichert wurde.

Was ist los mit HttpURLConnection?

Edit: Ich habe versucht, Testdatei von anderen Server von HTTP-Protokoll herunterladen und alles war in Ordnung. Es scheint sich um ein server- oder protokollspezifisches Problem zu handeln. Aber warum wget es schafft, die ganze Datei herunterzuladen?

Edit2: Nach Ihre Ratschläge habe ich auch versucht:

  • connection.setDoOutput entfernen (true);
  • verwenden Link-Umleitung 302
  • ersetzen Files.copy Verfahren durch benutzerdefinierte Implementierung von oben

Leider keine hilft zu vermeiden.

Edit3: Ich bemerkte, dass die Datei auch auf dem gleichen Server über unsichere HTTP-Protokoll verfügbar ist. Also änderte ich nur die URL in meinem Code und nach Sekunden bekam ich:

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

Mein Verständnis von readTimeout ist, dass die Zeit warten, bis Daten verfügbar sind. Jedenfalls sind sie in Millisekunden, und Sie haben 240.000 - 4 Minuten gegeben. – KDM

+0

Ich habe versucht, beide Timeouts auf 10s zu verringern oder auf 10m zu erhöhen, aber es unterbricht immer nach 180s. –

+0

Könnten Sie den kompletten Stacktrace der beobachteten Ausnahme posten? –

Antwort

2

Ich habe hier endlich eine Lösung gefunden It is not possible to download large files at Jetty server (danke nochmal StackOverflow). Problem war auf der Serverseite.

Jetty 9.2, die wir verwendet haben, hat einen Fehler, der das Bedienen großer Dateien bei langsamen Verbindungen (https://bugs.eclipse.org/bugs/show_bug.cgi?id=472621) unterbricht. Es scheint, dass eine Ausnahme nicht immer geworfen wird.

Wget und Browser konnten den Download trotz blockierter Übertragung oder Verbindungszurücksetzung irgendwie beenden.Leider war meine Java-Anwendung empfindlicher ...

Upgrade Bundle Jetty auf die letzte stabile Version 9.3.3 alle Probleme mit Downloads behoben.

0
connection.setRequestMethod("GET"); 

Hier Sie beabsichtigen, eine HTTP-GET zu tun.

connection.setDoOutput(true); 

Hier ändern Sie es zu PUT.

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

Hier erhalten Sie den Eingangsstrom, ohne jemals etwas geschrieben zu haben. Der Server wartet immer noch auf die POST-Daten, die Sie nie senden, so dass es nie eine Antwort sendet, so dass Sie ein Zeitlimit erreichen.

Die setDoOutput(true); Linie verlieren.

+0

Danke für die Antwort, aber es hat nicht geholfen. –

+0

Sie müssen zeigen, was Sie getan haben. Bearbeiten Sie es in Ihre Frage. – EJP

Verwandte Themen