sendMessage from outside in autobahn running in separate thread

后端 未结 2 1800
天命终不由人
天命终不由人 2020-12-17 02:38

I want to call sendMessage method from outside of MyServerProtocol class and send a message to connected clients. I use threading to d

相关标签:
2条回答
  • 2020-12-17 03:09

    is [there] another way to send clients message from outside of server class?

    I do something like this to send message. I use twisted to run my web app.

    import json
    from autobahn.twisted.websocket import WebSocketServerProtocol
    from twisted.internet import reactor
    
    class MyProtocol(WebSocketServerProtocol):
        connections = list()
    
        def onConnect(self, request):
            self.connections.append(self)
    
        def onClose(self, wasClean, code, reason):
            self.connections.remove(self)
    
        @classmethod
        def broadcast_message(cls, data):
            payload = json.dumps(data, ensure_ascii = False).encode('utf8')
            for c in set(cls.connections):
                reactor.callFromThread(cls.sendMessage, c, payload)
    
    
    # Somewhere else
    MyProtocol.broadcast_message({'greeting': 'Hello world'})
    

    I do not know if it is The Right Way™, but it works well for me.

    0 讨论(0)
  • 2020-12-17 03:16

    add self.factory to your "init(self):" see below:

    from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
        from twisted.internet import reactor
        import threading
    
        class MyServerProtocol(WebSocketServerProtocol):
            def onConnect(self, request):
                print("Client connecting: {0}".format(request.peer))
    
            def onOpen(self):
                print("WebSocket connection open.")
    
            def onMessage(self, payload, isBinary):
                if isBinary:
                    print("Binary message received: {0} bytes".format(len(payload)))
                else:
                    print("Text message received: {0}".format(payload.decode('utf8')))
    
                self.sendMessage(payload, isBinary)
    
            def onClose(self, wasClean, code, reason):
                print("WebSocket connection closed: {0}".format(reason))
    
    
        class Connection(threading.Thread):
            def __init__(self,factory):
                super(Connection, self).__init__()
                self.factory=WebSocketServerFactory("ws://localhost:9000", debug=False)
            def run(self):
                self.factory.protocol = MyServerProtocol()
                reactor.listenTCP(9000, self.factory)
                reactor.run(installSignalHandlers=0)
    
            def send(self, data):
                reactor.callFromThread(self.factory.protocol.sendMessage, self.factory.protocol, data)
    
        connection = Connection()
        connection.daemon = True
        connection.start()
        connection.send('test')
    
    0 讨论(0)
提交回复
热议问题