Domanda

Sto cercando un modo per inviare periodicamente alcuni dati su tutti i client collegati a una porta TCP. Sto guardando il pitone contorto e sono a conoscenza di reattore. CallLater. Ma come lo uso per inviare periodicamente alcuni dati a tutti i client connessi? La logica di invio dei dati è in classe Protocollo ed è istanziata dal reattore secondo necessità. Non so come collegarlo dal reattore a tutte le istanze di protocollo ...

È stato utile?

Soluzione

Probabilmente vorrai farlo in Factory per le connessioni. Factory non viene avvisato automaticamente ogni volta che viene stabilita e persa una connessione, pertanto è possibile notificarlo dal protocollo.

Ecco un esempio completo di come usare twisted.internet.task.LoopingCall in combinazione con una Factory e un protocollo di base personalizzati per annunciare che '10 secondi sono passati' a ogni connessione ogni 10 secondi.

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

Altri suggerimenti

Immagino che il modo più semplice per farlo sia quello di gestire un elenco di client nel protocollo con connectionMade e connectionLost nel client e quindi utilizzare una LoopingCall per chiedere a ciascun client di inviare dati.

Sembra un po 'invasivo, ma non credo che vorresti farlo senza che il protocollo avesse un certo controllo sulla trasmissione / ricezione. Certo, dovrei vedere il tuo codice per sapere davvero come si adatterebbe bene. Hai un link github? :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top