Я создаю веб-приложение в реальном времени. Я хочу иметь возможность отправлять широковещательные сообщения из серверной реализации моего приложения python.
Вот настройка:
Я могу успешно отправлять 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 сообщения. Я хочу транслировать сообщение всем подключенным клиентам, чтобы они могли быть проинформированы в режиме реального времени, если новый пользователь присоединяется к группе (например, в приложении чата).
Итак, вот мои вопросы:
Как я могу отправить широковещательное сообщение всем подключенным клиентам?
Как отправить широковещательное сообщение нескольким подключенным клиентам, подписанным на определенный канал?
Как отправить широковещательное сообщение в любое место в коде Python (за пределами класса BaseConnection
)?Потребуется ли для этого какой-то Socket.IO клиент для python или это встроено в TornadIO2?
Все эти трансляции должны быть сделаны надежным способом, поэтому я думаю, что веб-сокеты являются лучшим выбором. Но я открыт для всех хороших решений.