문제

TCP 포트에 연결된 모든 클라이언트를 통해 정기적으로 일부 데이터를 보낼 수있는 방법을 찾고 있습니다. 나는 뒤틀린 파이썬을보고 있으며 반응기를 알고 있습니다. 그러나이를 사용하여 모든 연결된 클라이언트에게 정기적으로 데이터를 보내는 방법은 무엇입니까? 데이터 전송 논리는 프로토콜 클래스에 있으며 필요에 따라 원자로에 의해 인스턴스화됩니다. 반응기에서 모든 프로토콜 인스턴스로 묶는 방법을 모르겠습니다 ...

도움이 되었습니까?

해결책

연결을 위해 공장 에서이 작업을 수행하고 싶을 것입니다. 공장은 연결이 만들어지고 손실 될 때마다 자동으로 알림을받지 않으므로 프로토콜에서 알릴 수 있습니다.

다음은 Twisted.internet.task.loopingCall을 사용하는 방법에 대한 완전한 예입니다. 사용자 정의 된 기본 공장 및 프로토콜과 함께 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()

다른 팁

가장 쉬운 방법은 클라이언트의 ConnectionMade 및 ConnectionLost를 사용하여 프로토콜에서 클라이언트 목록을 관리 한 다음 루핑 칼을 사용하여 각 클라이언트에게 데이터를 보내도록 요청하는 것입니다.

그것은 약간 침습적 인 느낌이 들지만, 전송/수신을 약간 제어 할 수없는 프로토콜 없이는 그렇게하고 싶지 않다고 생각합니다. 물론, 나는 그것이 어떻게 잘 맞는지 알기 위해 당신의 코드를보아야합니다. github 링크가 있습니까? :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top