Domanda

Ho questo client contorta, che si collega con un server contorto avere un indice. Ho eseguito questo client da riga di comando. Ha funzionato bene. Ora ho modificato per eseguire in loop (vedi main()) in modo che io possa mantenere l'esecuzione di query. Ma il cliente viene eseguito solo una volta. La prossima volta si dice semplicemente connection lost \n Connection lost - goodbye!.

Che cosa sto facendo di sbagliato? Nel ciclo sto riconnessione al server, che non va?

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()
È stato utile?

Soluzione

Non riesco a capire come funziona il reattore intrecciati.

reactor.run() si sta avviando evento-loop del reattore --- è una chiamata di blocco che loop "per sempre".

http://twistedmatrix.com/documents/10.2 .0 / core / howto / reattore-basics.html per vari argomenti reattore-correlato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top