Для решения, основанного на торнадо/торнадио, ваш класс 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, а не на торнадо.
ОБНОВИТЬ:
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')
person
Tony Abou-Assaleh
schedule
08.03.2012