Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#7

Re: Viele große Dateien übers Netzwerk verschieben

  Alt 5. Okt 2008, 23:11
Wie wäre es mit einer Art Torrent-System?

Der Client erstellt zuerst ein eine Art torrent-File für die zu übertragenen Dateien. Jede Datei wird in kleine Parts (sagen wir mal 10 MB) unterteilt (also nur im Container, nicht die Datei selbst) und jedes Part bekommt einen einzelnen Hash. Zusätzlich bekommt dann noch die komplette Datei einen Hash über alle Parts sowie über alle Daten.

Wenn du jetzt eine Datei an den Server schicken willst, sendest du zuerst die Container-Daten mit den Hashes und den Dateigrößen. Dieses Containerfile überprüfst du dann wiederum erstmal, in dem du einen Hash-Vergleich machst. Ist das Container-File in Ordnung, sendet der Server nacheinander Request an den Client, der dann die Daten der einzelnen Parts überträgt. Sobald ein Part ankommen ist und die CheckSumme des Parts beim Server mit der CheckSumme im Containerfile übereinstimmt, sendet der Server ein weiteren Request an den Clienten, bei dem er einen neuen, noch nicht vorhandenen Part anfragt.

Dies wiederholt der Server so lange, bis alle Parts herungergeladen und alle Checksummen übereinstimmen. Damit der Server die einzelnen Clients erkennt, könnten die sich ber UDP-Broadcast beim Server melden.

Das lästigste dabei wäre dabei die Erstellung des Container-Files, da dies bei 1-4 GB doch schon ein paar Minuten dauern kann. Jedoch bist du dann ziemlich sicher, ob irgendwelche Dateien fehlerhaft sind. Dann musst du nicht mehr die komplette Datei anfordnern sondern nur den Part, der eine falsche CheckSumme hat.

Das ganze kannst du noch besser machen, wenn mehrere identische Dateien von mehreren Clienten auf einmal gesendet werden. Dann kannst du verschiedene Parts von unterschiedlichen Clienten herunterladen - gleichzeitig bei einer Datei.

Ich hab sowas schon mal gemacht, hat ca. 1-2 Wochen gedauert und hat super funktioniert.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat