对于基于 tornado/tornadio 的解决方案,您的 SocketConnection 类需要在类级别维护一个连接列表。您的 on_connect 处理程序会将连接添加到此列表,而 on_close 将删除它。有关示例伪代码,请参阅 Serge S. Koval 的 this post。代码复制如下:
声明你的 TornadIO 连接类:
class MyConnection(SocketConnection):
participants = set()
@classmethod
def broadcast(cls, msg):
for p in cls.participants:
p.send(msg)
@classmethod
def controller_msg(cls, msg):
cls.broadcast(msg)
在您的设备轮询线程中,执行以下操作:
while True:
datum = file.readline()
if len(datum) > 2:
t = json.loads(datum)
...
def callback():
MyConnection.controller_msg(t)
io_loop.add_callback(callback)
另外,gevent-socketio 支持消息广播,但它基于 gevent,而不是 tornado。
更新:
tornadio2 已经维护了一个活动会话列表,所以您需要做的就是:
class MyConnection(SocketConnection):
def broadcast(self, event, message):
for session_id, session in self.session.server._sessions._items.iteritems():
session.conn.emit(event, message)
这是因为每个连接实例都有一个对其会话的引用,该会话引用了用于创建应用程序的全局路由器(存储为server),它在SessionContainer 对象中维护会话列表_sessions。现在,每当您想在连接类中广播消息时,只需执行以下操作:
self.broadcast('my_custom_event', 'my_event_args')