Question

Je cherche un moyen d'envoyer périodiquement des données sur tous les clients connectés à un port TCP. Je regarde python tordu et je suis au courant de réacteur.callLater. Mais comment l'utiliser pour envoyer des données à tous les clients connectés périodiquement? La logique d'envoi des données est dans la classe de protocole et elle est instanciée par le réacteur selon les besoins. Je ne sais pas comment faire le lien entre le réacteur et toutes les instances de protocole ...

Était-ce utile?

La solution

Vous voudrez probablement faire cela dans l’usine pour les connexions. L’usine n’est pas automatiquement avertie chaque fois qu’une connexion est établie et perdue, vous pouvez donc l’avertir depuis le protocole.

Voici un exemple complet d'utilisation de twisted.internet.task.LoopingCall avec une fabrique et un protocole de base personnalisés pour annoncer que "10 secondes sont écoulées" pour chaque connexion toutes les 10 secondes.

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()

Autres conseils

J'imagine que le moyen le plus simple de procéder consiste à gérer une liste de clients du protocole avec connectionMade et connectionLost dans le client, puis à utiliser un appel en boucle pour demander à chaque client d'envoyer des données.

Cela semble un peu invasif, mais je ne pense pas que vous souhaitiez le faire sans que le protocole contrôle un peu la transmission / réception. Bien sûr, je devrais voir votre code pour vraiment savoir comment il s'intégrerait bien. Vous avez un lien github? :)

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