Pergunta

Eu estou procurando uma maneira de enviar periodicamente alguns dados sobre todos os clientes conectados a uma porta TCP. Estou olhando para python torcida e estou ciente de reactor.callLater. Mas como posso usá-lo para enviar alguns dados para todos os clientes conectados periodicamente? A lógica envio de dados é na classe Protocolo e ele é instanciado pelo reator, conforme necessário. Eu não sei como amarrar-lo do reator para todas as instâncias do protocolo ...

Foi útil?

Solução

Você provavelmente quer fazer isso na fábrica para as conexões. A fábrica não é notificado automaticamente de cada vez que uma conexão é feita e perdeu, para que possa comunicar-lhe a partir do protocolo.

Aqui está um exemplo completo de como usar twisted.internet.task.LoopingCall em conjunto com um personalizado básico de fábrica e Protocolo de anunciar que '10 segundos passou' para cada conexão a cada 10 segundos.

from twisted.internet import reactor, protocol, task

class MyProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.clientConnectionMade(self)
    def connectionLost(self, reason):
        self.factory.clientConnectionLost(self)

class MyFactory(protocol.Factory):
    protocol = MyProtocol
    def __init__(self):
        self.clients = []
        self.lc = task.LoopingCall(self.announce)
        self.lc.start(10)

    def announce(self):
        for client in self.clients:
            client.transport.write("10 seconds has passed\n")

    def clientConnectionMade(self, client):
        self.clients.append(client)

    def clientConnectionLost(self, client):
        self.clients.remove(client)

myfactory = MyFactory()
reactor.listenTCP(9000, myfactory)
reactor.run()

Outras dicas

Eu imagino que a maneira mais fácil de fazer isso é para gerenciar uma lista de clientes no protocolo com connectionMade e connectionlost no cliente e, em seguida, usar um LoopingCall pedir a cada cliente para enviar dados.

Que se sente um pouco invasivo, mas eu não acho que você gostaria de fazê-lo sem o protocolo ter algum controle sobre a transmissão / recepção. Claro, eu teria que ver o seu código para realmente saber como ele iria encaixar bem. Tem um link github? :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top