Seite 1 von 1

Socket Data Transfer

Verfasst: Donnerstag 9. April 2009, 12:31
von scrippi
Hallo Community,

ich habe im Internet ein nettes Tutorial zum Thema Sockets unter Python gefunden und habe sogar schon geschafft nen eigenen kleinen HTTP Server zu bauen so übungsweise.

Der Source vom Tutorial sehe so aus:

Code: Alles auswählen

#!/usr/bin/env python
import SocketServer
PORT = 6000

class Service(SocketServer.StreamRequestHandler):
    def handle(self):
        print 'Connection: ', self.client_address
        data = self.rfile.readline()
        #self.wfile.write('Thanks for sending: ')
        #self.wfile.write(data)
        self.wfile.write(self.shttp())
    def shttp(self):
        string = """HTTP/0.9 302 Found\r\nLocation: http://localhost:6000/\r\nCache-Control: private\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Wed, 08 Apr 2009 14:52:17 GMT\r\nServer: localhost\r\nContent-Length: 4\r\n\r\nhttp"""
        return string
    

dispatcher = SocketServer.ForkingTCPServer(('', PORT), Service)
print 'listening on %d ...' % PORT
dispatcher.serve_forever()
(das mit http habe ich selbst dazugecodet)

Nun wäre meine Frage eher, wie kann man mit dieser Methode Dateien übertragen, evtl sogar so das man parallel dazu irgendwie abfragen könnte wieviel übertragen worden is (bei größeren Dateien, dann halt mit Prozent, übertragungsrate etc....)

weiß da jemand was?

lg scrippi

Verfasst: Donnerstag 9. April 2009, 12:51
von Civili4n
Ich kann dir leider nicht weiterhelfen aber ich würde gerne wissen wo du dieses tutorial gefunden hast, würds auch gerne lesen :)

Gruß Civili4n

Verfasst: Donnerstag 9. April 2009, 16:26
von ms4py

Verfasst: Freitag 10. April 2009, 10:39
von scrippi
danke für den Link, aber es war eher nur ne Übung zum verstehen.

Ich dachte eher so an, wie lass ich über Sockets Dateien Fliegen wie zB. über ftp, so dass ich auch den Fortschritt ermitteln kann usw..

weiß da jemand was?

Verfasst: Freitag 10. April 2009, 11:01
von ms4py
Du solltest dich mal allgemein mit TCP/IP und darüberliegenden Protokollen wie FTP oder HTTP befassen, wenn du in dieser Richtung was lernen willst.

Im Prinzip musst du dann ein Protokoll selbst entwickeln.
Eine sehr einfach Lösung wäre es, eine Datei in n gleich große Pakete aufzuteilen. In der Nachricht steht dann eine Kennung für das aktuelle Packet und Anzahl aller Pakete. So kannst du auf dem Client überprüfen, ob alle Pakete angekommen sind und die Daten in der richtigen Reihenfolge zusammensetzen.
Für so ein Paket kann man z.B. eine xml Struktur verwenden:

Code: Alles auswählen

<msg><packets current="1">n</packets><data>[...]</data></msg>
Um weniger Overhead zu haben, kannst du auch Trennzeichen oder ähnliches in der Nachricht verwenden, XML ist in Bezug auf Fehler aber viel besser.

Verfasst: Freitag 10. April 2009, 11:42
von lunar
XML ist mit das dümmste Format, welches man für Binärdaten nutzen kann ... diese müsste man dann nämlich mit base64 oder etwas ähnlichem kodieren, um zu verhindern, dass sich der Parser an Sonderzeichen verschluckt oder die Binärdaten verstümmelt. Der Overhead ist um ein Vielfaches größer als bei einem einfachen Binärformat, dass eine festgelegte Anzahl an Bytes am Anfang dazu benutzt, um Länge und Paketnummer zu übertragen.

Allerdings verstehe ich nicht ganz, warum der OP unbedingt ein eigenes Protokoll entwickeln sollte ... jedes verbreitete Protokoll zur Dateiübertragung übermittelt vorher die Länge der übertragenen Daten, so dass man auf Seiten des Clients eine Fortschrittsanzeige implementieren kann.

Verfasst: Sonntag 12. April 2009, 21:45
von birkenfeld
ice2k3 hat geschrieben:XML ist in Bezug auf Fehler aber viel besser.
Wie denn das?

Verfasst: Montag 13. April 2009, 13:56
von BlackJack
Würde mich auch interessieren, aber da habe ich an anderer Stelle auch keine Antwort auf Nachfrage erhalten. XML ist wohl irgendwie magisch. :-)