HttpURLConnection getInputStream: Zeitüberschreitung immer nach 180 Sekunden

8

Ich versuche auf diese Weise eine Datei mit sehr langsamer Verbindung herunterzuladen:

%Vor%

und mir ist aufgefallen, dass es aus bestimmten Gründen (natives Windows Socket Timeout?) immer bricht nach 180 Sekunden des Downloads ohne Ausnahmen.

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

Ich habe versucht, diese Datei mit wget herunterzuladen:

%Vor%

Die vollständige Datei wurde nach 20 Minuten erfolgreich auf der Festplatte gespeichert.

Was ist los mit HttpURLConnection?

Bearbeiten: Ich habe versucht, Testdatei von anderem Server durch HTTP-Protokoll herunterzuladen, und alles war OK. Es scheint sich um ein server- oder protokollspezifisches Problem zu handeln. Aber warum wget es schafft ganze Datei herunterzuladen?

Edit2: Ihren Ratschlägen folgend habe ich auch versucht:

  • entfernen connection.setDoOutput (true);
  • Verwenden Sie den direkten Link, um eine Umleitung zu vermeiden 302
  • Ersetzen Sie die Files.copy-Methode durch die benutzerdefinierte Implementierung

Leider hilft nichts von oben.

Bearbeiten3: Ich habe festgestellt, dass diese Datei auch auf dem gleichen Server über das unsichere http-Protokoll verfügbar ist. Also habe ich nur die URL in meinem Code geändert und nach 120 Sekunden habe ich:

%Vor%     
Tomasz Ceszke 08.09.2015, 06:24
quelle

2 Antworten

2

Ich habe endlich eine Lösung gefunden It Es ist nicht möglich, große Dateien auf dem Jetty-Server herunterzuladen (danke nochmal StackOverflow). Problem war auf der Serverseite.

Jetty 9.2, das wir verwendet haben, hat einen Fehler, der das Serving großer Dateien bei langsamen Verbindungen unterbricht ( Ссылка ). Es scheint, dass eine Ausnahme nicht immer geworfen wird.

Wget und Browser konnten den Download trotz blockiertem Transfer oder Verbindungsreset irgendwie beenden. Leider war meine Java-Anwendung empfindlicher ...

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

    
Tomasz Ceszke 11.09.2015, 12:14
quelle
0
%Vor%

Hier beabsichtigen Sie ein HTTP GET durchzuführen.

%Vor%

Hier ändern Sie es in PUT.

%Vor%

Hier erhalten Sie den Eingabestrom, 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 das Zeitlimit überschreiten.

Verliere die setDoOutput(true); -Zeile.

    
EJP 08.09.2015 08:33
quelle