Frage

Ich bin auf der Suche nach einer Möglichkeit, in regelmäßigen Abständen einige Daten über alle Clients mit einem TCP-Port zu senden. Ich betrachte Twisted Python und ich bin mir dessen bewusst reactor.callLater. Aber wie verwende ich sie in regelmäßigen Abständen einige Daten an alle angeschlossenen Clients senden? Das Senden von Daten Logik ist in Protokoll-Klasse und wird durch den Reaktor instanziiert nach Bedarf. Ich weiß nicht, wie es für alle Protokollinstanzen von Reaktor zu binden ...

War es hilfreich?

Lösung

Sie würden wahrscheinlich wollen diese für die Verbindungen in der Fabrik zu tun. Die Fabrik wird nicht automatisch benachrichtigt jedes Mal, wenn eine Verbindung hergestellt wird und verloren, so können Sie es aus dem Protokoll mit.

Hier ist ein vollständiges Beispiel dafür, wie twisted.internet.task.LoopingCall in Verbindung mit einer angepassten Grund Factory und Protokoll zu verwenden, zu verkünden, dass '10 Sekunden haben ‚bestanden jede Verbindung alle 10 Sekunden.

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

Andere Tipps

Ich würde die einfachste Art und Weise vorstellen, dass zu tun, ist eine Liste der Clients in dem Protokoll mit connectionMade und connectionLost im Client zu verwalten und dann eine LoopingCall verwenden, um jeden Kunden zu bitten, Daten zu senden.

Das fühlt sich ein wenig invasive, aber ich glaube nicht, dass Sie es tun wollen würde, ohne das Protokoll eine gewisse Kontrolle über die Sende- / Empfangs aufweist. Natürlich würde ich sehen müssen wissen, um Ihren Code wirklich, wie es gut passen würde. Haben Sie einen Github Link? :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top