Создать клиент / сервер с Twisted - PullRequest
6 голосов
/ 28 марта 2011

Я пытаюсь создать клиент / сервер, используя 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()

Как видите, я хотел бы отправить (в качестве сервера) некоторые полученные данные (в качестве клиента). Моя проблема, конечно, заключается в том, что мой ServerControl не создан в моем ClientControl, поэтому у меня нет доступа к транспорту, который необходим для отправки данных клиентам.

Извините, если мне не понятно, я новичок в Python и Twisted, а английский не мой основной язык :( Не стесняйтесь спрашивать, если вы что-то упустили!

Заранее спасибо за любую помощь =)

1 Ответ

3 голосов
/ 28 марта 2011

Единственное, чего вам не хватает, так это того, что вы можете сохранить список ваших клиентских подключений и сделать этот список доступным для кода, который пытается отправить данные всем клиентам.

В Twisted FAQ есть пример этого: http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#HowdoImakeinputononeconnectionresultinoutputonanother

В этом примере только одна фабрика, но идея та же. Чтобы справиться с вашим делом на двух фабриках, просто укажите одну фабрику на другую.

...