Frage

Ich habe diesen verdrehten Client, der mit einem verdrehten Server eine Index mit einem Index verbindet. Ich habe diesen Client von der Befehlszeile geleitet. Es hat gut funktioniert. Jetzt habe ich es so geändert, dass es in Schleife ausgeführt wird (siehe main()) damit ich weiter abfragen kann. Aber der Kunde läuft nur einmal. Das nächste Mal sagt es einfach einfach connection lost \n Connection lost - goodbye!.

Was mache ich falsch? In der Schleife verbinde ich wieder mit dem Server, so falsch?

from twisted.internet import reactor
from twisted.internet import protocol

from settings import AS_SERVER_HOST, AS_SERVER_PORT

# a client protocol
class Spell_client(protocol.Protocol):
    """Once connected, send a message, then print the result."""

    def connectionMade(self):
        self.transport.write(self.factory.query)

    def dataReceived(self, data):
        "As soon as any data is received, write it back."
        if data == '!':
            self.factory.results = ''
        else:
            self.factory.results = data
        self.transport.loseConnection()

    def connectionLost(self, reason):
        print "\tconnection lost"

class Spell_Factory(protocol.ClientFactory):
    protocol = Spell_client

    def __init__(self, query):
        self.query   = query
        self.results = ''

    def clientConnectionFailed(self, connector, reason):
        print "\tConnection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "\tConnection lost - goodbye!"
        reactor.stop()

# this connects the protocol to a server runing on port 8090
def main(): 
    print 'Connecting to %s:%d' % (AS_SERVER_HOST, AS_SERVER_PORT)
    while True:
        print
        query = raw_input("Query:")
        if query == '': return
        f = Spell_Factory(query) 
        reactor.connectTCP(AS_SERVER_HOST, AS_SERVER_PORT, f)
        reactor.run()
        print f.results
    return

if __name__ == '__main__':
    main()
War es hilfreich?

Lösung

Sie verstehen nicht ganz, wie der verdrehte Reaktor funktioniert.

reactor.run() Startet die Event-Schleife des Reaktors --- Es ist ein blockierender Anruf, der "für immer" ist.

Sehen http://twistedmatrix.com/documents/10.2.0/core/howto/reactor-basics.html für verschiedene reaktorbezogene Themen.

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