Download einer binären Datei vom Internet
Übersicht

nobodyBetreff: Download einer binären Datei vom Internet |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich versuche größere binäre Dateien(5-10mb) durch einen TCP Stream runterzuladen. Ich habe verschiedene Möglichkeiten ausprobiert, aber die Größe meiner runtergeladenen Datei stimmt niemals mit dem Original überein(entweder mehrere kb größer oder kleiner). Ich weis allerdings 100%, dass ich den richtigen Anfang erwische(kein Stück vom HTTP Protokoll)
Original Dateigröße: 5.187kb WriteLine file, ReadLine(tcp) - schnellster Download und kleinste Differenz ( 5.190kb ) WriteString file, ReadString(tcp) - 5.227kb WriteByte file, ReadByte(tcp) - ~2.500kb Durch den Hex Editor hab ich rausgefunden, dass bei der ersten Variante nur das durch WriteLine angehange 0Dh Probleme bereitet. Ich könnte WriteLine wahrscheinlich jedes Mal auf einen temporären Stream anwenden und dann, das 0Dh löschen, aber dass scheint mir zu aufwendig ![]() [edit] Hab ein wenig mit SeekFile(file,FileSize("file.dat")-[1-3]) rumgespielt, aber das ändert seltsamerweise auch nichts |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Benutze doch Banks dafür. Das Problem ist nämlich, bei jedem ReadByte fragt Blitz nach einem TCP-Package ab. Auch bei jedem ReadLine wird intern ReadByte benutzt, bis ein \n oder \r gefunden wurde. Das macht die Sache doch sehr lahm.
Besser sind Banks. Du erstellst eine Bank mit sagen wir 10 KByte Größe (der Payload bei TCP ist laut meinen Berechnungen 2^16 - 1 Byte). Das ist dein Buffer. Code: [AUSKLAPPEN] While Not Eof(tcpStream)
; Vom Server lesen size = ReadBytes(buffer, tcpStream, 0, BankSize(buffer)) ; In Datei schreiben WriteBytes(buffer, fileStream, 0, size) Wend Hier versucht er immer 10 KByte einzulesen was deutlich effizienter ist. Sollten bspw. nur 100 Byte zur Verfügung stehen, dann ist size = 100 und es werden dann auch nur 100 Byte in die Datei abgelegt. ReadString geht nicht, da intern ein Integer Länge ausgelesen wird. Irgendwo wirst du in der Binärdatei eine ungünstige Konstellation haben, bei der Länge = 2 Millionen ist o.ä. und Blitz versucht dann 2 Millionen Zeichen einzulesen. ReadLine ist ungünstig, da \n und/oder \r für ReadLine genügen aber \n\r immer bei WriteLine geschrieben werden. Außerdem ist ReadLine ausschließlich für Textdateien zu benutzen. mfg olli |
||
vertex.dreamfall.at | GitHub |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group