24

TCP ポートに接続されているすべてのクライアントで定期的にデータを送信する方法を探しています。私はツイスト python を見ていますが、reactor.callLater を認識しています。しかし、それを使用して、接続されているすべてのクライアントに定期的にデータを送信するにはどうすればよいですか? データ送信ロジックは Protocol クラスにあり、必要に応じてリアクターによってインスタンス化されます。リアクターからすべてのプロトコルインスタンスに結び付ける方法がわかりません...

4

2 に答える 2

38

おそらく、接続のために Factory でこれを行いたいと思うでしょう。Factory は、接続が確立されたり失われたりするたびに自動的に通知されるわけではないため、プロトコルから通知できます。

以下は、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()
于 2008-11-25T07:12:05.703 に答える
3

これを行う最も簡単な方法は、クライアントで connectionMade と connectionLost を使用してプロトコルでクライアントのリストを管理し、次に LoopingCall を使用して各クライアントにデータを送信するように依頼することだと思います。

それは少し侵略的だと感じますが、プロトコルが送信/受信をある程度制御せずにそれを実行したいとは思わないでしょう。もちろん、それがどのようにうまく適合するかを本当に知るために、あなたのコードを見る必要があります。github リンクを取得しましたか? :)

于 2008-11-24T23:19:48.170 に答える