Moin!
Java Programm (schickt Anfrage, z.B. "http://einserver/file.zip) -> http://phpserver/proxyscript.php (nimmt Anfrage entgegen, ließt von file.zip und gibt die Daten in 10 KB schritten an das Java Prog.)
Die Frage, die uns alle bewegt: Warum zum Teufel in 10KB-Schritten? Ohne diese Anforderung wäre dein Problem keines - und schätzungsweise denkst du zu kompliziert für deine Lösung. Ich würde nämlich, wenn das Java-Programm denn unbedingt 10KB-Happen haben will, einfach 10KB-weise vom TCP-Socket einlesen - das PHP-Skript selbst merkt von der Paketierung nichts, sondern liefert einen Datenstrom aus - ganz schlicht und einfach. Wenn der Java-Client nicht weiterliest, um z.B. Daten zu verarbeiten, gerät halt der Datenstrom ins Stocken. Ist zwar nicht unbedingt schön, weil während der Übertragung natürlich Serverressourcen gebunden sind - aber während eines langen Downloads mit einem normalen Browser per Modem ist das ja auch der Fall - und selbst wenn der Client schneller möchte, gehts wegen der Leitung nicht. In deinem Fall gehts wegen dem Client eben nicht.
Desweiteren gibt es ein massives perfomance Problem, für eine poplige 200 KB Datei, die zu testzwecken vom lokalen Webserver geladen wurde, benötigt man schon ca. 10-20 sec. liegt evtl daran das ich alles Byteweise lesen und schreiben muss, da eine Zeilenweise übermittlung, bei Binärdaten wie zip Files etc. Schwachsinnig ist. Hab das Ganze auch mal direkt versucht, also Java Prog. -> Downloadquelle, war aber auch nicht schneller.
Wenn du jedes 10KB-Stück als separaten HTTP-Request anforderst, dann ist deine Performance wirklich kein Wunder. Bedenke, dass jedesmal eine TCP-Verbindung hergestellt werden muss, dann der Server das PHP-Skript startet, dann PHP seinerseits eine HTTP-Verbindung herstellen muß, Daten liest, puffert und weiterleitet, und schließlich dein Java-Programm die Daten erhält. Massiv umständlich, würde ich mal sagen. Insbesondere die ständigen Verbindungsherstellungen kosten Zeit. Daumenregel: Eine HTTP-Verbindung liefert frühestens nach der doppelten Ping-Zeit zum Zielrechner erste Daten.
Überleg mal selbst: Gute Ping-Zeiten liegen beispielsweise bei 50 ms - also fließen nach frühestens 100 ms Daten. Das ganze aber doppelt (das PHP-Skript benötigt ja auch Zeit zum Verbindungsaufbau). Also pro Element schon mal mindestens 200 ms. Deine Testdatei zerfällt in 10 Stücke - sind schlappe 2 Sekunden nur für Verbindungsaufbauten, wo normalerweise ein Zehntel der Zeit reichen würde.
Was ebenfalls Zeit kostet, sind die Serverreaktionen. Nimm einfach einen Wert an: Wie lange benötigt ein Server vom Eingang des Requests bis zur Auslieferung des Content? Multipliziere für dein Stückendownload mit zehn.
Dann kommt natürlich die Bandbreite der beteiligten Leitungen ins Spiel. Es ist schwer abzuschätzen, was du zur Verfügung hast - und außerdem weiß ich nicht, wie lange der Download der Datei normal dauert - aber da du die Leitung zusätzlich mit HTTP-Requests und Responses belegst, die zwischen 500 Byte und 1 Kilobyte groß sein können, verlierst du auch dadurch zehnmal mehr Performance.
Summa summarum ist wohl davon auszugehen, dass du 5 bis zehnmal mehr Zeit zum Download benötigst, als wenn du ohne Flickenteppich downlädst.
Da du in Java ja ohnehin einen Stream liest - lies einfach solange, wie du Daten benötigst, und mache Pausen, wenn du gerade keine Daten benötigst - die Daten laufen dir nicht weg, sondern stehen in Puffern, die nicht überlaufen, weil einfach keine Daten nachgeschickt werden, wenn der TCP/IP-Netzwerklayer deines Rechners keine Bestätigung schickt, dass wieder Platz im Puffer ist.
- Sven Rautenberg