optimale HTTP Downloads

Status
Nicht offen für weitere Antworten.
K

Kevin1990

Gast
Hi,

ich hätte mal eine allgemeine Frage zu http downloads.
Im Moment lade ich mit folgendem Code herunter:

Code:
   String link = "..."; //irgendein Link
   String filename = "..."; //irgendein Dateiname
   URL url = new URL(link);
   InputStream is = url.openConnection.getInputStream();
   OutputStream os = new FileOutputStream(filename);
   byte[] buffer = new byte[4096];
   int rc;

   while((rc = is.read(buffer)) != -1) {
      out.write(buffer, 0, rc);
   }
   out.flush();
   out.close();

Nun wenn ich in die Netzwerküberwachung schaue, fällt mir auf, dass immer für 10s geladen wird, dann 5s nicht, dann wieder 10s usw.

Woran könnte dies liegen?

Vielen Dank schonmal

mfg
Kevin[/code]
 

foobar

Top Contributor
Das liegt vielleicht am Webserver oder an deiner Leitung. Haste das mal mit unterschiedlichen Urls getestet?
 
K

Kevin1990

Gast
so ich habe verschiedenste Buffergrößen getestet und dabei ist mir aufgefallen, dass wenn die Downloadgeschwindigkeit durch eine zu geringe Buffergröße limitiert wird, der Download wunderbar läuft.

Wähle ich allerdings die Buffergröße zu hoch, so wirkt es so, als ob der Webserver nach einigen angeforderten Kilobytes blockiert und das Programm solange in der read() - Funktion verweilt bis neue Daten vom Server geliefert werden.
 
T

tuxedo

Gast
Bei normalen Webseiten würde ich den Buffer nicht auf 4096 belassen. Da würde ich vielleicht 512 oder 1024 nehmen.

Für Filedownloads machen dann Werte >1024 schon mehr Sinn.

Gruß
Alex
 
G

Guest

Gast
Ich muss gestehen ich habe nur geraten, ich bin auch java anfänger ;-)
 

xote

Mitglied
Und zu doof, mich richtig im Forum anzumelden bin ich auch...

Ich habe mich schon immer gefragt, wie das mit den Buffergrößen so ist.
 
K

Kevin1990

Gast
also danke für die Antworten ... ich habe mir jetzt selbst nen Algorithmus ausgedacht, der das ganze etwas glättet:

Code:
int receivedBytes;
int sleepTime = 0;
int counter = -1;
byte[] buffer = new byte[2048];
long before = System.currentTimeMillis();
long last = 0;

while ((receivedBytes = is.read(buffer)) > -1) {
  try {
    Thread.sleep(sleepTime);
  } catch (InterruptedException interrupted) {
    interrupted.printStackTrace();
  }
  long after = System.currentTimeMillis();
  // Zeit der Paketanforderung vom Server  
  long difference = before - after;
  long current = difference;   
  // vergleich der Zeiten zwischen dem aktuellen und dem letzten Schleifendurchlauf
  if (Math.abs(current - last) > 100)) {
    if(last!=0) {
      sleepTime += 2;
    }
  }
  long last = current;
  os.write(buffer, 0, receivedBytes);
  before = System.currentTimeMillis();
}

MfG
 

HoaX

Top Contributor
was soll das schlafen bringen? einen geschwindigkeitszuwachs im ganzen wirst du damit nicht bekommen imo
 
K

Kevin1990

Gast
Es ging mir mehr oder wengier nur darum, eine konstante Geschwindigkeit zu erhalten. Und meine jetzige Lösung vermeidet diese ständigen Wechsel zwischen 0 kb/s und 500 kb/s.
 

HoaX

Top Contributor
was hast du davon wenn er (scheinbar) konstant ist, dafür aber langsamer?
bist du sicher dass das messinstrument richtig funktioniert? mal andere probiert?
 
T

tuxedo

Gast
Was hälst du davon die Transfergeschwindigkeit mal direkt im Java-Code zu messen? Ich tippe mal darauf dass dein Messinstrument quatsch produziert.
 

cschaedl

Mitglied
Mein Messgerät produziert keinen Quatsch ;)
getestet unter Win XP, Ubuntu und MacOS
auch unter verschiedenen Rechnern


überall das gleiche Problem und im Javacode hab ichs auch bereits getestet ... genau das gleiche.
 
T

tuxedo

Gast
Also ich kann dir nur sagen, dass ich mit UrlConnections Megabyteweise Daten von unterschiedlichen URLs (lokal, via Internet, ...) saugen kann ohne dass es zu solchen Einbrüchen kommt. Im lokalen Netzwerk komme ich nahezu an die 10MB/sek ran. Im Internet mit DSL6000 und einem guten Server zwischen 600 und 700kbyte/sek.

Gemessen hab ich das bei HTTP und HTTPS
a) direkt in Java in dem ich die eingehenden bytes am InoutStream gezählt habe
b) In Windows (XP) mit dem Tool "DuMeter"
c) Unter Linux (Debian und openSuSE) mit gkrellm

Damit schließe ich Java als "Fehlerquelle" für das von dir beschriebene Verhalten aus.

Was bei dir so ein Verhalten produziert: Kein Plan.

- Alex
 

cschaedl

Mitglied
Deine Daten stimmen schon ... bei mir funktioniert das auch weitestgehend problemlos, allerdings kommt es bei einigen "wenigen" Webservern zu dem geschilderten Problem. Vor allem bei denjenigen, die einen limitierten Traffic besitzen.

@Hoax ... durch diesen ständigen Wechsel der Download-Geschwindigkeit, wird die CPU stärker beansprucht. Im Schnitt habe ich dadurch 2% mehr CPU-Auslastung als bei konstanter Download-Geschwindigkeit.
 
T

tuxedo

Gast
>> allerdings kommt es bei einigen "wenigen" Webservern zu dem geschilderten Problem. Vor allem bei denjenigen, die einen limitierten Traffic besitzen.

Aha, und damit rückst du erst jetzt raus.... ?

>> @Hoax ... durch diesen ständigen Wechsel der Download-Geschwindigkeit, wird die CPU stärker beansprucht. Im Schnitt habe ich dadurch 2% mehr CPU-Auslastung als bei konstanter Download-Geschwindigkeit.

Bitte was? Wenn man sauber programmiert hat und keine Billig-VomLasterGefallen-SüdostasienHinterhof-Netzwerkkarte hat, dann ist der CPU die Last auf dem Netzwerk sowas von egal....
Klar, bei manchen Mainboards mit OnBoard Netzwerk übernimmt die CPU die Steuerung der Netzwerkkarte. Aber ich kann nicht glauben, dass bei einem Download aus dem Internet mit den paar kilobyte/sek (man beachte die Prozentuele Netzauslastung der Karte) die CPU mit 2% mehr belastet wird, vor allem wenn der Traffic stark schwankt...

Und selbst wenn das so wäre (ich gehe davon aus dass die Empfangsroutine noch irgendwo im Code ne Macke hat), dann bremst du nochmal zusätzlich künstlich den Stream, nur um wahnsinnige 2% CPU zu sparen? Mag sein dass die Lösung mit den momentan bekannten Problemfällen funktioniert, aber was ist mit dem nächsten der evtl anders drauf reagiert und die Sache dann nochmal weiter gebremst wird? Nur um wahnsinnige 2% zu sparen riskirst du, dass der User nicht die max. mögliche Geschwindigkeit bekommt.

Naja, jedem das Seine.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
O HTTP Wer hilft mit meinem UTF-8 http Request ? Netzwerkprogrammierung 1
G localhost im Backend https vs. http Netzwerkprogrammierung 9
J Simple HTTP Framework (basierend auf expressjs) Netzwerkprogrammierung 1
M HTTP Http requests aufzeichnen Netzwerkprogrammierung 2
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
M http request and response Netzwerkprogrammierung 0
M Verbindungszeit berechnen (TCP, HTTP/1.0, HTTP/1.1) Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
U HTTP XML vom Server abholen oder http Abfragen, Entscheidung treffen Netzwerkprogrammierung 0
P HTTP Server / Client Netzwerkprogrammierung 1
S HTTP-Requeste von Browser mit Java sniffen? Netzwerkprogrammierung 9
E HTTP java.lang.IllegalArgumentException: protocol = http host = null Netzwerkprogrammierung 1
M Server mit HTTP Netzwerkprogrammierung 9
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
B Socket HTTP-Request führt zu Endlosschleife Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D HTTP Bräuchte hilfe mit Http Requests Netzwerkprogrammierung 6
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
T HTTP Einen HTTP Server erstellen Netzwerkprogrammierung 20
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
Dit_ HTTP Einfache HTTP-Anfrage Netzwerkprogrammierung 6
nrg FileUpload HTTP POST Netzwerkprogrammierung 5
T Socket Java HTTP-Proxy Netzwerkprogrammierung 3
A HTTP Zugriff auf http-Server - Error 400 Netzwerkprogrammierung 11
B HTTP JSESSIONID in Http(s)URLConnection loswerden! Netzwerkprogrammierung 13
E Socket HTTP-Server Netzwerkprogrammierung 6
C HTTP POST Connect Netzwerkprogrammierung 9
D HTTP Java HTTP Kommunikation Netzwerkprogrammierung 9
R HTTP Apache HTTP Client: Request mit angehängter Datei Netzwerkprogrammierung 2
O Http request Netzwerkprogrammierung 7
Tobse HTTP ServerSocket HTTP Netzwerkprogrammierung 4
I HTTP Datei Uploaden mit http und Sprache anpassen Netzwerkprogrammierung 7
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N Http Client Netzwerkprogrammierung 3
W Asynchroner HTTP Client / non-blocking I/O Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
L Body eines http Request auslesen Netzwerkprogrammierung 2
T HTTP Encoding von Http-Streams Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
D http request Netzwerkprogrammierung 11
C HTTP Studienarbeit Kommunikation via HTTP mit POST zwischen Server und Client Netzwerkprogrammierung 7
Kr0e Simpler HTTP Stream server Test Netzwerkprogrammierung 3
K HTTP-Anfrage an einen Server wird nicht beantwortet Netzwerkprogrammierung 3
J org.apache.http.auth.NTCredentials Netzwerkprogrammierung 2
W Problem mit HTTP-Dateiübertragung Netzwerkprogrammierung 6
A org.apache.commons http client in Netbeans einbinden Netzwerkprogrammierung 3
G Http Client mit Redirect Enabled Netzwerkprogrammierung 2
M Http POST liefert kryptischen Content Netzwerkprogrammierung 4
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
B Wie HTTP GET/POST Anfrage versenden? Netzwerkprogrammierung 7
R HTTP Server Memory Leak? Netzwerkprogrammierung 6
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
G auf http-request antworten. Netzwerkprogrammierung 3
I http sniffer gesucht Netzwerkprogrammierung 10
G Socket + HTTP Header Netzwerkprogrammierung 2
R HTTP ServerThread Netzwerkprogrammierung 4
J HTTP GET? Netzwerkprogrammierung 6
C FTP vs HTTP Netzwerkprogrammierung 10
M HTTP-Response extrem fragmentiert Netzwerkprogrammierung 4
W HTTP-Upload Netzwerkprogrammierung 2
M HTTP response code: 401 ; ?aber im browser ist es abrufbar? Netzwerkprogrammierung 5
L Java HTTP Request Netzwerkprogrammierung 3
O Axis2 erstellt HTTP/1.1 anstatt HTTP/1.0 Netzwerkprogrammierung 3
B Fehler 401 bei http GET Netzwerkprogrammierung 2
S HTTP Request erstellen Netzwerkprogrammierung 2
E upload progress bei einem http file post Netzwerkprogrammierung 5
B lange Strings in http-Request? Netzwerkprogrammierung 3
K http-download Netzwerkprogrammierung 12
M erst POST dann Http-Request über URLConnection Netzwerkprogrammierung 3
I Apache http-client: Problem beim Proxyaufruf Netzwerkprogrammierung 2
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
M RMI over HTTP Netzwerkprogrammierung 5
M HTTP Requests verarbeiten und Response senden mit Java Netzwerkprogrammierung 14
G HTTP Response mit Transfer-Encoding:chunked einlesen Netzwerkprogrammierung 4
D HTTP Request erstellen (Form Name übergeben!) Netzwerkprogrammierung 3
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
L http kommunikation mit und ohne multipart Netzwerkprogrammierung 4
L file upload / download über http Netzwerkprogrammierung 5
G HTTP Client :: Komme nicht über den Proxy Netzwerkprogrammierung 7
P Easy Http Request Netzwerkprogrammierung 9
B non US-ASCII Dateinamen über HTTP? Netzwerkprogrammierung 2
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
P File von http-Server kopieren Netzwerkprogrammierung 5
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
G http 1.1 socket? Netzwerkprogrammierung 3
J HTTP-POST-Request mit Anhang über Socket Netzwerkprogrammierung 2
S http Server selber schreiben Netzwerkprogrammierung 5
S Suche API für einfachen HTTP-Zugriff. Netzwerkprogrammierung 17
Z HTTP Request Netzwerkprogrammierung 3
A http request per socket an apache server Netzwerkprogrammierung 5
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
N Download HTTP .php-Seite mit Anmeldung Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben