Frage

ich Python neu bin (Ich habe seit mehreren Jahren in Java Programmierung jetzt obwohl), und ich arbeite an einer einfachen Socket-basierten Netzwerk-Anwendung (nur zum Spaß). Die Idee ist, dass mein Code einer Verbindung zu einem Remote-TCP-Endpunkt und dann wartet auf alle Daten, die vom Server an den Client übertragen werden, und eine Analyse auf diesem auszuführen.

Die Daten vom Server geschoben werden -> Client ist UTF-8-codierter Text, und jede Zeile durch CRLF (\x0D\x0A) begrenzt ist. Sie wahrscheinlich erraten. Die Idee ist, dass der Client mit dem Server verbindet (bis sie vom Benutzer abgebrochen), und dann liest und analysiert die Linien, wie sie kommen in

Ich habe es geschafft, bekommen dies funktioniert, aber ich bin mir nicht sicher, dass ich ziemlich dies der richtige Weg mache. Also daher meine aktuellen Fragen (Code zu folgen):

  1. Ist dies der richtige Weg, um es in Python zu tun (dh. Ist es wirklich so einfach)?
  2. Irgendwelche Tipps / Tricks / nützliche Ressourcen (abgesehen von der Referenzdokumentation) über Puffer / asyncore?

Zur Zeit werden die Daten gelesen und gepuffert wie folgt:

def handle_read(self):
    self.ibuffer = b""

    while True:
        self.ibuffer += self.recv(self.buffer_size)
        if ByteUtils.ends_with_crlf(self.ibuffer):
            self.logger.debug("Got full line including CRLF")
            break
        else:
            self.logger.debug("Buffer not full yet (%s)", self.ibuffer)

    self.logger.debug("Filled up the buffer with line")
    print(str(self.ibuffer, encoding="UTF-8"))

Die ByteUtils.ends_with_crlf Funktion einfach überprüft die letzten beiden Bytes des Puffers für \x0D\x0A. Die erste Frage ist die wichtigste (Antwort auf dieser Basis), aber andere Ideen / Tipps sind erwünscht. Danke.

War es hilfreich?

Lösung

TCP ist ein Strom, und man kann nicht garantiert werden, dass Ihr Puffer enthalten, wird nicht das Ende einer Nachricht und den Anfang der nächsten. So wird die Überprüfung für \ n \ r am Ende des Puffers nicht in allen Situationen erwartet. Sie haben jedes Byte in dem Strom zu überprüfen.

Und, würde ich empfehlen, dass Sie Verdrehte anstelle von asyncore. So etwas wie dies (aus dem Gedächtnis, möglicherweise nicht aus der Box):

from twisted.internet import reactor, protocol
from twisted.protocols.basic import LineReceiver


class MyHandler(LineReceiver):

    def lineReceived(self, line):
        print "Got line:", line


f = protocol.ClientFactory()
f.protocol = MyHandler
reactor.connectTCP("127.0.0.1", 4711, f)
reactor.run()

Andere Tipps

Es ist noch einfacher - siehe asynchat und seine set_terminator Verfahren (und andere hilfreiche tidbits in diesem Modul). Verdrehte ist um Größenordnungen reicher und mächtiger, aber für hinreichend einfache Aufgaben, asyncore und asynchat (davon entworfen glatt) zu interagieren ist in der Tat sehr einfach zu bedienen, wie Sie beobachten begonnen haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top