python Socket.IO клиент для отправки широковещательных сообщений на сервер TornadIO2

Я создаю веб-приложение в реальном времени. Я хочу иметь возможность отправлять широковещательные сообщения из серверной реализации моего приложения python.

Вот настройка:

  • socketio.jsна стороне клиента
  • TornadIO2сервер как Socket.IO сервер
  • pythonна стороне сервера (Djangoфреймворк)

Я могу успешно отправлять socket.io сообщения от клиента к серверу. Сервер обрабатывает их и может отправить ответ. Ниже я опишу, как я это сделал.

Текущая настройка и код

Во-первых, нам нужно определить соединение, которое обрабатывает socket.io события:

class BaseConnection(tornadio2.SocketConnection):
    def on_message(self, message):
        pass

    # will be run if client uses socket.emit('connect', username)
    @event
    def connect(self, username):
        # send answer to client which will be handled by socket.on('log', function)
        self.emit('log', 'hello ' + username)

Запуск сервера осуществляется пользовательским методом управления Django:

class Command(BaseCommand):
    args = ''
    help = 'Starts the TornadIO2 server for handling socket.io connections'

    def handle(self, *args, **kwargs):
        autoreload.main(self.run, args, kwargs)

    def run(self, *args, **kwargs):
        port = settings.SOCKETIO_PORT

        router = tornadio2.TornadioRouter(BaseConnection)

        application = tornado.web.Application(
            router.urls,
            socket_io_port = port
        )

        print 'Starting socket.io server on port %s' % port
        server = SocketServer(application)

Очень хорошо, сервер работает сейчас. Добавим код клиента:


Очевидно, что {{ user.username }}будет заменен на имя пользователя, вошедшего в систему, в данном примере имя пользователя "alp".

Теперь каждый раз, когда страница обновляется, консольным выводом является:

connected
log: hello alp

Таким образом, вызов сообщений и отправка ответов работают. Но теперь наступает сложная часть.

Проблемы

Ответ «привет alp» отправляется только призывателю socket.io сообщения. Я хочу транслировать сообщение всем подключенным клиентам, чтобы они могли быть проинформированы в режиме реального времени, если новый пользователь присоединяется к группе (например, в приложении чата).

Итак, вот мои вопросы:

  1. Как я могу отправить широковещательное сообщение всем подключенным клиентам?

  2. Как отправить широковещательное сообщение нескольким подключенным клиентам, подписанным на определенный канал?

  3. Как отправить широковещательное сообщение в любое место в коде Python (за пределами класса BaseConnection)?Потребуется ли для этого какой-то Socket.IO клиент для python или это встроено в TornadIO2?

Все эти трансляции должны быть сделаны надежным способом, поэтому я думаю, что веб-сокеты являются лучшим выбором. Но я открыт для всех хороших решений.

19
задан Yuval Adam 8 June 2012 в 14:28
поделиться