python Socket.IO klient do wysyłania wiadomości rozgłoszeniowych na serwer TornadIO2

Buduję aplikację internetową w czasie rzeczywistym.Chcę móc wysyłać wiadomości rozgłoszeniowe z implementacji mojej aplikacji Pythona po stronie serwera.

Oto konfiguracja:

socketio.js po stronie klientaTornadIO2 serwer jako serwer Socket.IOpyton po stronie serwera (Django struktura)

Mogę z powodzeniem wysyłać wiadomości socket.io z klienta do serwera. Serwer obsługuje je i może wysłać odpowiedź. Poniżej opiszę, jak to zrobiłem.

Aktualna konfiguracja i kod

Po pierwsze, musimy zdefiniować połączenie, które obsługuje zdarzenia 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)

Uruchomienie serwera odbywa się za pomocą niestandardowej metody zarządzania 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)

Bardzo dobrze, serwer działa teraz. Dodajmy kod klienta:

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

Oczywiście,{{ user.username }} zostanie zastąpiona nazwą użytkownika aktualnie zalogowanego użytkownika, w tym przykładzie nazwa użytkownika to „alp”.

Teraz za każdym razem, gdy strona jest odświeżana, dane wyjściowe konsoli to:

connected
log: hello alp

Dlatego wywoływanie wiadomości i wysyłanie odpowiedzi działa.Ale teraz przychodzi trudna część.

Problemy

Odpowiedź „hello alp” jest wysyłana tylko do wywołującego komunikat socket.io. Chcę wysłać wiadomość do wszystkich podłączonych klientów, aby mogli być informowani w czasie rzeczywistym, jeśli nowy użytkownik dołączy do imprezy (na przykład w aplikacji do czatu).

Oto moje pytania:

Jak mogę wysłać wiadomość rozgłoszeniową do wszystkich podłączonych klientów?

Jak mogę wysłać wiadomość rozgłoszeniową do wielu podłączonych klientów, którzy są subskrybowani na określonym kanale?

Jak mogę wysłać wiadomość rozgłoszeniową w dowolnym miejscu mojego kodu Pythona (pozaBaseConnection klasa)? Czy wymagałoby to pewnego rodzaju klienta Socket.IO dla Pythona lub czy jest on wbudowany w TornadIO2?

Wszystkie te transmisje powinny być wykonywane w niezawodny sposób, więc sądzę, że najlepszym wyborem są gniazda internetowe. Ale jestem otwarty na wszystkie dobre rozwiązania.

questionAnswers(3)

yourAnswerToTheQuestion