受这个问题启发,我有一个非常简单的设置:Tornado - Listen to multiple clients simultaneously over websockets
基本上,我有一个Websocket处理程序,可以连接到许多websocket客户端。然后我有另一个websocket处理程序“ DataHandler”,每次接收到消息时都会广播一条消息。
因此,我列出了TestHandler实例的全局列表,并使用它来向所有实例广播消息
ws://127.0.0.1/test_service/
TestHandler可以通过地址ws://127.0.0.1/data/
接收消息,而DataHandler可以通过地址ws_clients
接收消息,但是每当我遍历TestHandler
时,我就永远不会在{{1 }}。
我做错什么了吗?
答案 0 :(得分:2)
这就是我要做的-我将在TestHandler
上创建一个新方法,该方法将
一个目的-接收一条消息并将其发送给所有连接的客户端。
在进入代码之前,我想指出(传统上)将ws_clients
保留在类而不是全局对象中似乎更好。并使用set
代替list
。
class TestHandler(...):
ws_clients = set() # use set instead of list to avoid duplicate connections
def open(self):
self.ws_clients.add(self)
@classmethod
def broadcast(cls, message):
"""Takes a message and sends to all connected clients"""
for client in cls.ws_clients:
# here you can calculate `var` depending on each client
client.write_message(message)
def on_close(self):
# remove the client from `ws_clients`
self.ws_client.remove(self)
# then you can call TestHandler.broadcast
# from anywhere in your code
# example:
class DataHandler(...):
...
def on_message(self, message):
# pass the message to TestHandler
# to send out to connected clients
TestHandler.broadcast(message)