python Socket.IO-Client zum Senden von Broadcast-Nachrichten an den TornadIO2-Server

Ich erstelle eine Echtzeit-Webanwendung.Ich möchte Broadcast-Nachrichten von der serverseitigen Implementierung meiner Python-Anwendung senden können.

Hier ist das Setup:

socketio.js auf der Client-SeiteTornadIO2 Server als Socket.IO ServerPython auf der Serverseite (Django Rahmen)

Ich kann erfolgreich Socket.io-Nachrichten vom Client an den Server senden. Der Server verarbeitet diese und kann eine Antwort senden. Im Folgenden werde ich beschreiben, wie ich das gemacht habe.

Aktuelles Setup und Code

Zunächst müssen wir eine Verbindung definieren, die socket.io-Ereignisse verarbeitet:

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)

Das Starten des Servers erfolgt mit einer benutzerdefinierten Django-Verwaltungsmethode:

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)

Sehr gut, der Server läuft jetzt. Fügen wir den Client-Code hinzu:

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

Offensichtlich,{{ user.username }} wird durch den Benutzernamen des aktuell angemeldeten Benutzers ersetzt, in diesem Beispiel ist der Benutzername "alp".

Jetzt lautet die Konsolenausgabe jedes Mal, wenn die Seite aktualisiert wird, wie folgt:

connected
log: hello alp

Daher funktioniert das Aufrufen von Nachrichten und das Senden von Antworten.Aber jetzt kommt der schwierige Teil.

Probleme

Die Antwort "hallo alp" wird nur an den Aufrufer der socket.io-Nachricht gesendet. Ich möchte eine Nachricht an alle verbundenen Clients senden, damit diese in Echtzeit benachrichtigt werden können, wenn ein neuer Benutzer der Partei beitritt (z. B. in einer Chat-Anwendung).

Also, hier sind meine Fragen:

Wie kann ich eine Broadcast-Nachricht an alle verbundenen Clients senden?

Wie kann ich eine Broadcast-Nachricht an mehrere verbundene Clients senden, die auf einem bestimmten Kanal angemeldet sind?

Wie kann ich eine Broadcast - Nachricht an eine beliebige Stelle in meinem Python - Code senden (außerhalb desBaseConnection Klasse)? Würde dies eine Art Socket.IO-Client für Python erfordern oder ist dies in TornadIO2 integriert?

Alle diese Sendungen sollten auf verlässliche Art und Weise ausgestrahlt werden. Ich denke, Websockets sind die beste Wahl. Aber ich bin offen für alle guten Lösungen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage