我正在寻找一种方法,可以通过连接到TCP端口的所有客户端定期发送一些数据。我正在看扭曲的python,我知道了react.callLater。但是,如何使用它定期向所有连接的客户端发送一些数据?数据发送逻辑属于协议(protocol)类,并由 react 堆根据需要实例化。我不知道如何将它从 react 堆绑定(bind)到所有协议(protocol)实例...

最佳答案

您可能希望在工厂中进行连接。每次建立连接和断开连接时,不会自动通知工厂,因此您可以从协议(protocol)中通知工厂。

这是一个完整的示例,说明如何将twisted.internet.task.LoopingCall与自定义的基本Factory和Protocol结合使用,以每10秒向每个连接声明“10秒已经过去”。

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

关于python - 以扭曲协议(protocol)定期运行功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/315716/

10-16 19:06