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)
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
Ich habe versucht, beide Timeouts auf 10s zu verringern oder auf 10m zu erhöhen, aber es unterbricht immer nach 180s. –
Könnten Sie den kompletten Stacktrace der beobachteten Ausnahme posten? –