Socket Data 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
scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

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
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

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?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

ice2k3 hat geschrieben:XML ist in Bezug auf Fehler aber viel besser.
Wie denn das?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Würde mich auch interessieren, aber da habe ich an anderer Stelle auch keine Antwort auf Nachfrage erhalten. XML ist wohl irgendwie magisch. :-)
Antworten