[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