cliente Socket.IO python para enviar mensagens de difusão para o servidor TornadIO2

Eu estou construindo uma aplicação web em tempo real.Eu quero ser capaz de enviar mensagens de difusão da implementação do lado do servidor do meu aplicativo python.

Aqui está a configuração:

socketio.js no lado do clienteTornadio2 servidor como servidor Socket.IOpython no lado do servidor (Django estrutura)

Eu posso enviar com sucesso as mensagens socket.io do cliente para o servidor. O servidor lida com isso e pode enviar uma resposta. A seguir vou descrever como eu fiz isso.

Configuração atual e código

Primeiro, precisamos definir uma conexão que lide com eventos 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)

A inicialização do servidor é feita por um método personalizado de gerenciamento do 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)

Muito bem, o servidor é executado agora. Vamos adicionar o código do cliente:

<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>

Obviamente,{{ user.username }} será substituído pelo nome de usuário do usuário atualmente conectado, neste exemplo, o nome de usuário é "alp".

Agora, toda vez que a página é atualizada, a saída do console é:

connected
log: hello alp

Portanto, invocar mensagens e enviar respostas funciona.Mas agora vem a parte complicada.

Problemas

A resposta "hello alp" é enviada apenas para o invocador da mensagem socket.io. Quero transmitir uma mensagem para todos os clientes conectados, para que eles possam ser informados em tempo real se um novo usuário entrar na parte (por exemplo, em um aplicativo de bate-papo).

Então, aqui estão as minhas questões:

Como posso enviar uma mensagem de broadcast para todos os clientes conectados?

Como posso enviar uma mensagem de difusão para vários clientes conectados que estão inscritos em um canal específico?

Como posso enviar uma mensagem de broadcast em qualquer lugar no meu código python (fora doBaseConnection classe)? Isso exigiria algum tipo de cliente Socket.IO para python ou isso é feito com o TornadIO2?

Todas essas transmissões devem ser feitas de forma confiável, então eu acho que websockets são a melhor escolha. Mas estou aberto a todas as boas soluções.

questionAnswers(3)

yourAnswerToTheQuestion