BLOB Übertragung/File Transfer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Wie überträgt man am besten größere Datenmengen von einem Rechner zum anderen? Und wenn möglich auch sicher? Geht mal davon aus, dass man nicht einfach kopieren kann, weil es sich u.U. um verschiedene Betriebssysteme in einem LAN handelt...

Oder mal anders gefragt: Habe eine XML-RPC-Anwendung. Meine Idee war, dass der Client den Server nach Daten fragt. Nach einer Prüfung durch den Server kann dieser eine lokale Datei einlesen und zum Client übertragen. Ich dachte dabei an eine simple Lösung ähnlich wie bei einem HTTP-Server. Oder eben sowas wie 'wget' (das es unter Windows nicht gibt).

Beim Versenden einer E-Mail (so kenn ich das aus PHP und das dürfte ja standardisiert sein) gibt es zusätzliche Header. Das ist alles ein String. Man kann aber Dateianhänge über ein encoding einfach in den String schreiben und schon hat man einen Dateianhang. Ich dachte mir evtl. auch, dass der XML-RPC-Server binäre Daten einfach nur als encodierten String zum Client schickt. Geht das? Oder ist das eher ungünstig oder zu lahm?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben:Wie überträgt man am besten größere Datenmengen von einem Rechner zum anderen? Und wenn möglich auch sicher? Geht mal davon aus, dass man nicht einfach kopieren kann, weil es sich u.U. um verschiedene Betriebssysteme in einem LAN handelt...
Hi droptix!

Du kannst zwar mit Python einiges nachprogrammieren, aber das was du beschrieben hast gibt es schon lange.

In Windows ist das schon seit langer Zeit integriert und unter Linux gibt es Samba http://us4.samba.org/samba/, das sehr gut dafür geeignet ist, die Welt zwischen Linux, Mac und Windows ein wenig kleiner zu machen.

Für die sichere Datenüberträgung empfehle ich dir OpenVPN http://openvpn.net/. Das verschlüsselt den kompletten Datenverkehr.

Es geht noch weiter. Es gibt FTPS http://proftpd.de/ http://www.proftpd.de/HowTo_SFTP_TLS_ve ... .55.0.html oder SFTP, die aber nicht so schön in die Windows-Welt integriert sind. Dafür brauchst du dann unter Windows ein Client-Programm wie zum Beispiel FileZilla http://www.filezilla.de/.

Einfaches Übertragen von Dateien geht auch mit SCP, das unter Linux bei OpenSSH http://www.openssh.org/ mit dabei ist und unter Windows mit Cygwin http://cygwin.com/ mit installiert wird. Bei Linux ist SSH meist schon als Daemon (Service) eingerichtet und unter Windows kannst du dir mit Cygwin einen SSH-Daemon (Service/Dienst) einrichten. Wenn du mit Private-Key und Public-Key arbeitest, dann brauchst du nicht mal ein Passwort angeben. Dann genügt z.B. der Befehl ``scp /home/gerold/testdatei.txt nachbarcomputer:/home/gerold/`` um die Datei zu übertragen.

Dann gibt es noch FTP durch einen verschlüsselten Tunnel durch oder HTTPS mit Hilfe eines guten Webservers (z.B. Apache http://httpd.apache.org/).

Das sind so die gängigsten Methoden, die mir so auf die Schnelle eingefallen sind.

Da du Python als TCP-Server sowie als -Client einsetzen kannst, ist es natürlich auch wunderbar dafür geeignet, Daten jeder Art von einem Computer zum nächsten zu übertragen.

Auch XMLRPC ist dafür geeignet. Du musst die Datei nur vorher in einen String verwandeln und danach wieder zurück. Das geht zum Beispiel mit den Modulen Pickle oder binascii. Das ist bei XMLRPC notwendig, da XMLRPC auf einfache Datentypen wie Integer, Float, String, Dictionary usw. beschränkt ist.

Willst du etwas komplexeres programmieren, dann könnte eventuell noch PyRo http://pyro.sourceforge.net/ etwas für dich sein.

lg
Gerold
:-)
Zuletzt geändert von gerold am Samstag 1. April 2006, 10:27, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben:Oder eben sowas wie 'wget' (das es unter Windows nicht gibt).
Wget gibt es sehrwohl auch für Windows. Erstens ist es bei Cygwin mit dabei und zweitens http://users.ugent.be/~bpuype/wget/ 8)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Oder mal anders gefragt: Habe eine XML-RPC-Anwendung. Meine Idee war, dass der Client den Server nach Daten fragt. Nach einer Prüfung durch den Server kann dieser eine lokale Datei einlesen und zum Client übertragen. Ich dachte dabei an eine simple Lösung ähnlich wie bei einem HTTP-Server. Oder eben sowas wie 'wget' (das es unter Windows nicht gibt).
Ich habe das gefühl, dass du dafür etwas schnelleres brauchst, denn XML-RPC ist zwar simpel, platformübergreifend und auch sonst sehr praktisch, aber schnell ist es nicht. Sieh dir vielleicht Ice (Website grad down) oder CORBA an, die sind schneller (und auch komplexer). Aber für Binärdaten möglicherweise besser geeignet.
droptix hat geschrieben:Beim Versenden einer E-Mail (so kenn ich das aus PHP und das dürfte ja standardisiert sein) gibt es zusätzliche Header. Das ist alles ein String. Man kann aber Dateianhänge über ein encoding einfach in den String schreiben und schon hat man einen Dateianhang. Ich dachte mir evtl. auch, dass der XML-RPC-Server binäre Daten einfach nur als encodierten String zum Client schickt. Geht das? Oder ist das eher ungünstig oder zu lahm?
XML-RPC kann Binärdaten übertragen, es encoded sie in base64 wie in der Doku beschrieben. Allerdings brauchst du dich nicht wundern, wenn die Dateien groß werden, ist ja base64.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

@gerold: Ich kenne all die Programme. Aber die kann man ja nicht alle voraussetzen. Deshalb möchte ich ein einziges Programm, dass die wichtigen Sachen daraus kann. Ich möchte keinen Apache voraussetzen, wenn die Software dort eingesetzt werden soll, wo kein Apache installiert ist, sondern z.B. IIS. Es soll absolut plattformunabhängig werden und deshalb keine Anforderungen an Drittprogramme stellen.

Mit 'wget' meinte ich ein natives Windows-wget, dass überall drauf ist... ist eben auch nicht bei allen Unixen der Fall, deswegen möchte ich es auch nicht voraussetzen, weil es OS-spezifisch ist.

Und ich dachte mir zwar, dass man mit base64 Daten übertragen kann, aber wie Leonidas sagte: über XML-RPC wird das wahrscheinlich sehr langsam sein. Wäre halt zu testen.

@Leonidas: Was wird bei base64 so groß? Ich dachte daran, zip- bzw. bz2-gepackte Daten rüber zu schieben. Bläht base64 die Daten wieder auf?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben:Es soll absolut plattformunabhängig werden und deshalb keine Anforderungen an Drittprogramme stellen.
Hi droptix!

Dann wird dir wohl nichts anderes übrig bleiben als es selber in Python zu schreiben. :wink:

- *XMLRPC* kann nur mit Strings, deshalb wird alles zum Übertragen in einen String umgewandelt. Wie wir wissen verlangsamt das die Übertragung.

- *PyRo* arbeitet mit *pickle* und kann deshalb alles übertragen, was man so in ein Pickle-Objekt rein bekommt. Ob ein *StringIO*-Objekt gepickelt werden kann, das muss man ausprobieren. PyRo nimmt einem die Netzwerkverwaltung ab und erleichtert es einen Netzwerkverbund aufzubauen.

- *crypto* kann zum Verschlüsseln der zu übertragenden Daten verwendet werden. http://www.amk.ca/python/code/crypto.html
In der Readme-Datei steht ein einfaches Beispiel.

- Mit *asyncore* hast du volle Kontrolle über die Daten die übertragen werden. Du bist also nicht auf XMLRPC oder andere Highlevel-Protokolle angewiesen. Damit kannst du Socket-Server und -Client schreiben. Wie du die Daten überträgst, bleibt dir überlassen. Du kannst dich also voll auf die Geschwindigkeit konzentrieren.

- Man sollte auch noch *SocketServer* und *Socket* erwähnen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Jeah, jeah, jeah! Das sind doch tolle Neuigkeiten... Danke, ich werd mich durchlesen!
Antworten