Python Autobahn WebSocketServerProtocol访问服务器工厂

2024-10-03 02:43:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用autobahnpythonwebsocket实现并查看repohere上的broadscast服务器示例

在本例中,BroadcastServerProtocol类通过self.factory访问分配给它的工厂,这允许它将客户机注册到工厂实例。你知道吗

这是怎么回事?我在任何超类中都看不到factory属性集,所以我猜在某个地方有一个函数将工厂分配给BroadcastServerProtocol类,但我不确定在哪里。你知道吗

有人能解释一下这是怎么回事吗?为了便于阅读,我复制了下面示例中的相关代码。你知道吗

class BroadcastServerProtocol(WebSocketServerProtocol):

    def onOpen(self):
        self.factory.register(self)

    def onMessage(self, payload, isBinary):
        if not isBinary:
            msg = "{} from {}".format(payload.decode('utf8'), self.peer)
            self.factory.broadcast(msg)

    def connectionLost(self, reason):
        WebSocketServerProtocol.connectionLost(self, reason)
        self.factory.unregister(self)


class BroadcastServerFactory(WebSocketServerFactory):

    """
    Simple broadcast server broadcasting any message it receives to all
    currently connected clients.
    """

    def __init__(self, url):
        WebSocketServerFactory.__init__(self, url)
        self.clients = []
        self.tickcount = 0
        self.tick()

    def tick(self):
        self.tickcount += 1
        self.broadcast("tick %d from server" % self.tickcount)
        reactor.callLater(1, self.tick)

    def register(self, client):
        if client not in self.clients:
            print("registered client {}".format(client.peer))
            self.clients.append(client)

    def unregister(self, client):
        if client in self.clients:
            print("unregistered client {}".format(client.peer))
            self.clients.remove(client)

    def broadcast(self, msg):
        print("broadcasting message '{}' ..".format(msg))
        for c in self.clients:
            c.sendMessage(msg.encode('utf8'))
            print("message sent to {}".format(c.peer))

Tags: selfclientformatmessageiffactory工厂def