Zeilen aus Socket-Stream rausfischen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Maurice

Dienstag 28. Januar 2003, 21:23

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.
Maurice

Dienstag 28. Januar 2003, 21:27

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.
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dienstag 28. Januar 2003, 22:45

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
Maurice

Mittwoch 29. Januar 2003, 00:02

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.
Antworten