Pregunta

Tengo este cliente trenzado, que se conecta con un servidor de trenzado que tienen un índice. Me encontré con este cliente de línea de comandos. Funcionó bien. Ahora he modificado para que se ejecute en bucle (ver main()) de modo que pueda mantener consultas. Pero el cliente se ejecuta sólo una vez. La próxima vez que simplemente dice connection lost \n Connection lost - goodbye!.

¿Qué estoy haciendo mal? En el bucle estoy volver a conectar con el servidor, que mal?

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()
¿Fue útil?

Solución

No entiendo muy bien cómo funciona el reactor Twisted.

reactor.run() se está iniciando evento de circuito del reactor --- es una llamada de bloqueo que los bucles "para siempre".

http://twistedmatrix.com/documents/10.2 0,0 / core / howto / reactor-basics.html para diversos temas de reactor-relacionada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top