Seite 1 von 1

Zeilen aus Socket-Stream rausfischen

Verfasst: Dienstag 28. Januar 2003, 21:23
von Maurice
Hallo,

da die meisten tcp-Protokolle ja nach dem Schema "befehl\r\n" funktionieren,
ergab sich für mich nun die Problematik, aus dem Socket-Stream eben diese Zeilen zu konstruieren.

Nun hab ich das mal versucht:

Code: Alles auswählen

buffer = ""
while 1:
   received = client.recv(1024)
   if not received:
      break

   buffer = buffer + received;        # erstmal speichern

   while 1:                           # solange zeilen im Buffer sind
      crlf_pos = buffer.find("\r\n")
      if crlf_pos == -1:
         break
      
      line = buffer[:crlf_pos]
      buffer = buffer[crlf_pos+2:]    # gelesene Zeile aus Buffer löschen

      print "Zeile empfangen:", line
Das ist jetzt nicht nur furchtbar hässlich, sondern es erscheint mir auch uneffizient.
Ausserdem ist es sehr ungünstig, dass das Verarbeiten der Zeile in der Schleife stattfinden muss.

Verfasst: Dienstag 28. Januar 2003, 21:27
von Maurice
Jetzt hab ich die Frage ganz vergessen :->

Wie macht man das besser?

Irgendwie hab ich das Gefühl ich nutze die Techniken der Sprache nicht so richtig.

Verfasst: Dienstag 28. Januar 2003, 22:45
von Voges
Maurice hat geschrieben:Wie macht man das besser?
Ob's viel besser ist, weiß ich nicht, aber Du könntest die innere while-Schleife ersetzen durch:

Code: Alles auswählen

lines = string.split(buffer,"\r\n")  # import string nicht vergessen
buffer = lines[-1] 
lines = lines[:-1] 
for line in lines:
    print "Zeile empfangen:", line
Jan

Verfasst: Mittwoch 29. Januar 2003, 00:02
von Maurice
Dank dir!

Find ich schon wesentlich besser. Macht den Code kürzer und vor allem ist schonmal eine unschöne while-1-break-Schleife weg :)

Leider muss man so auf die Nachrichten immer noch wie auf ein Event reagieren.. das erschwert die Abarbeitung des Protokolls.

Gut wäre, wenn man das in eine Funktion kapseln könnte, die immer nur eine Zeile zurückgibt:

Code: Alles auswählen

recvLine()
# mach was
recvLine()
# noch was

usw.
Das würde die Kommunikation erheblich vereinfachen.