Для решения, основанного на tornado / tornadio, ваш класс SocketConnection должен поддерживать список соединений на уровне класса. Ваш обработчик on_connect добавит соединение в этот список, а on_close удалит его. Образец псевдокода см. в этом посте . Автор: Сергей С. Коваль. Код приведен ниже:
Объявите свой класс подключения 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, а не на торнадо.
UPDATE:
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')