[Python-de] Dateien ueber Sockets uebertragen

Alexander 'boesi' Bösecke boesi.josi at gmx.net
Mit Apr 7 11:44:54 CEST 2004


Hi

Am 05.04.2004 20:51:33 schrieb Hartmut Goebel:

> > Ein time.sleep(0.2) nach dem ersten send brachte Abhilfe, das war aber
> > natuerlich keine Loesung
> 
> Damit hast Du vielleicht einen word-around gefunden, aber das Problem 
> nicht gelöst. Oder konntest Du danahc sagen: "Aha, daran war es gelegen"?

Deswegen ja auch "das war aber natuerlich keine Loesung"
Und ausserdem ... hat sich eine gewisse Anwendung namens Word inzwischen
als Synonym fuer work-around verbreitet? *g*
 
> Ja: eval ist typischerweise ein Zeichen von schlechtem Code, da es sich 
> in den meisten Fällen vermeiden läßt.

Naja vermeiden kann man verdammt viel. Aber ist eval von der Performance
her denn so schlecht? Oder was sind konkrete Nachteile von eval? (also
nicht nur auf mein aktuelles Problem bezogen)

> Für den Lösungsweg, den Du unten gegangen bist, wäre es aber okay --
> ich würde nur gleich einen anderen Lösungsweg gehen ;-)
 
Dazu faellt mir jetzt Perl ein - There's more than one way to do it. *g*

> Allerdings machst Du unten -- nach meinem Geschmack -- viel zu viel per 
> Hand. Ich würde dann noch eher eine Mischung aus Deinem vorherigen 
> Ansatz machen: Daten Pickeln und deren Länge vornewegschicken.

Ok, hab deine Anmerkungen in die beiden Methoden eingearbeitet, die
sehen jetzt so aus:

    def sendData(self, data, File=0):
        if File == 1:
            typ = 'F'
        else:
            data = cPickle.dumps(data)
            typ = 'P'
        self.sendall('%d-%s.%s' % (len(data), typ, data))

Den Typ F verwende ich fuer Daten, die Teil von Dateien sind, irgendwie
find ichs albern die zu picklen. 

    def recvData(self):
        while 1:                                            # Header der Nachricht
            index = self.getData.find('.')
            if index != -1:
                length, typ = self.getData[:index].split('-', 1)
                length = int(length)
                self.getData = self.getData[index+1:]
                break
            self.getData += self.recv(self.BufSize)
        while 1:                                            # Daten der Nachricht
            if length <= len(self.getData):
                data = self.getData[:length]
                if length < len(self.getData):
                    self.getData = self.getData[length:]
                else:
                    self.getData = ''
                break
            self.getData += self.recv(self.BufSize)
        if typ == 'P': data = cPickle.loads(data)           # Konvertierung der Daten
        return data

> (kann man noch optimieren).

Wenn du weitere Vorschlaege hast...

thx & cu boesi
-- 
A Achkatz'l ofm Baam                                 #1671 : icq-intern
des hot a schins Laam                            #73628288 : icq-extern
braucht keen Pfenng Gald                          boesi111 : aim
un freit sich of dr Walt                              i171 : reallife