Question

J'ai ce client tordu, qui se connecte à un serveur torsadée ayant un indice. J'ai couru ce client en ligne de commande. Il a bien fonctionné. Maintenant, je l'ai modifié pour fonctionner en boucle (voir main()) afin que je puisse garder l'interrogation. Mais le client fonctionne qu'une seule fois. La prochaine fois, il dit simplement connection lost \n Connection lost - goodbye!.

Qu'est-ce que je fais mal? Dans la boucle, je suis reconnecter au serveur, il qui ne va pas?

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()
Était-ce utile?

La solution

Vous ne comprenez pas tout à fait le fonctionnement du réacteur tordu.

reactor.run() est en cours de démarrage événement en boucle du réacteur --- il est un appel de blocage que les boucles « pour toujours ».

Voir http://twistedmatrix.com/documents/10.2 0,0 / core / howto / réacteur basics.html pour divers sujets liés au réacteur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top