Я создаю веб-приложение в реальном времени. Я хочу иметь возможность отправлять широковещательные сообщения с серверной реализации моего приложения python.
Вот настройка:
- socketio.js на стороне клиента
- TornadIO2 сервер как сервер Socket.IO
- python на стороне сервера (Django) li >
Я могу успешно отправлять сообщения socket.io от клиента на сервер. Сервер обрабатывает их и может отправлять ответ. Ниже я опишу, как я это сделал.
Текущая настройка и код
Во-первых, нам нужно определить Connection, которое обрабатывает события 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)
Хорошо, сервер работает сейчас. Добавьте код клиента:
<script type="text/javascript">
var sio = io.connect('localhost:9000');
sio.on('connect', function(data) {
console.log('connected');
sio.emit('connect', '{{ user.username }}');
});
sio.on('log', function(data) {
console.log("log: " + data);
});
</script>
Очевидно, что {{ user.username }}
будет заменено именем пользователя текущего пользователя, в этом примере имя пользователя - "alp".
Теперь, каждый раз, когда страница обновляется, вывод консоли:
connected
log: hello alp
Таким образом, вызывается обращение к сообщениям и отправке ответов. Но теперь идет сложная часть.
Проблемы
Ответ "hello alp" отправляется только в invoker сообщения socket.io. Я хочу передать сообщение всем подключенным клиентам, чтобы они могли быть проинформированы в реальном времени, если новый пользователь присоединяется к стороне (например, в приложении чата).
Итак, вот мои вопросы:
-
Как отправить широковещательное сообщение всем подключенным клиентам?
-
Как отправить широковещательное сообщение нескольким подключенным клиентам, которые подписаны на определенный канал?
-
Как я могу отправить широковещательное сообщение в любом месте моего кода python (вне класса
BaseConnection
)? Будет ли это требовать своего рода Socket.IO-клиента для python или это встроено в TornadIO2?
Все эти трансляции должны быть сделаны надежным способом, поэтому я думаю, что веб-сайты - лучший выбор. Но я открыт для всех хороших решений.