2011-03-28 16 views
6

Estoy intentando crear un cliente/servidor usando Twisted. Me gustaría crear un daemon, que se conectará a otro servidor como cliente y actuará como servidor para otros clientes. Tengo algo de escritura como la wich Creo describir mi problema:Crear cliente/servidor con Twisted

server = sys.argv[1] 
control_port = 8001 

class ControlClient(protocol.Protocol): 
    def makeConnection(self, transport): 
     [some code here -snip-] 
     self.firstOrder(order, transport) 

    def firstOrder(self, action, transport): 
     self.t = transport 
     self.t.write(action + "\0") 

    def sendOrder(self, action): 
     self.t.write(action + "\0") 

    def dataReceived(self, data): 
     [some code here -snip-] 
     [HERE I WANT TO SEND DATA TO CLIENTS CONNECTED TO MY TWISTED SERVER, USING CONTROL SERVER] 

class ControlServer(ControlClient): 
    def dataReceived(self, data): 
     print "client said " + data 

    def makeConnection(self, transport): 
     self.t = transport 
     self.t.write("make connection") 
     print "make connection" 

    def sendData(self, data): 
     self.t.write("data") 

class ClientFactory(protocol.ClientFactory): 
    protocol = ControlClient 

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

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

class ServerFactory(protocol.ServerFactory): 
    protocol = ControlServer 

def main(): 
    c = ClientFactory() 
    reactor.connectTCP(server, control_port, c) 
    s = ServerFactory() 
    reactor.listenTCP(9000, s) 
    reactor.run() 

if __name__ == '__main__': 
    main() 

Como se puede ver, me gustaría enviar (como un servidor) algunos datos recibidos (como cliente). Mi problema es, por supuesto, que mi ServerControl no está instanciado en mi ClientControl, por lo que no tengo acceso al transporte que se requiere para enviar datos a los clientes.

Lo siento si no soy comprensible, soy nuevo en Python y retorcido y sin Inglés es mi idioma principal :( no dude en preguntar si falta algo!

Gracias de antemano por cualquier ayuda =)

Respuesta

3

Lo único que parece que se está perdiendo es que puede mantener una lista de las conexiones de sus clientes y hacer que esa lista esté disponible para el código que está tratando de enviar datos a todos los clientes.

Hay un ejemplo de esto en el Twisted FAQ: http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#HowdoImakeinputononeconnectionresultinoutputonanother

Ese ejemplo sólo tiene una fábrica, pero la idea es la misma. Para manejar tu caso con dos fábricas, solo dale a una fábrica una referencia a la otra.

+0

Hola, gracias por su respuesta, intentaré esto. Parece ser la buena solución. – tirlototo

+0

Bueno, de nuevo gracias por su ayuda, ¡funciona muy bien! Que tengas un buen día =) – tirlototo

+0

ahah eres un desarrollador retorcido; =) – tirlototo