it-swarm.com.de

Was ist der Sinn von Räumen in socket.io?

Ich habe mich gefragt, was der Zweck von Zimmern ist. Siehe: https://socket.io/docs/rooms-and-namespaces/

Sie können join und leave grundsätzlich mit nur socket.on Und socket.off Nachahmen.

Nehmen Sie zum Beispiel:

(kein Zimmer)

klient:

socket.on('chat', (data) => {
    console.log("chat received", data)
    $(this.$refs.chatBox).append(`
        <div>
            ${data}
        </div>
    `)
})

server:

socket.on('chat', function (id, msg) {
    console.log("id:", id, 'message:', msg)
    socket.broadcast.emit('chat', msg);
    // io.emit('chat', msg)
})

Dies hört jetzt den "chat" Und ich kann ihn mit socket.off("chat") ausschalten


Jetzt mache ich etwas ähnliches, aber mit einem Raum:

klient:

// to join
socket.emit('waiting room', socket.id)
// to message
socket.emit('waiting room chat', { msg: this.$refs.waiting_input.value })

server:

socket.on('waiting room', function (id) {
    console.log("socket has joined the waiting room", id);
    socket.join("waiting room")
})

socket.on("waiting room chat", function(payload) {
    console.log("waiting room chat:", payload.msg)
    // io.to("waiting room").emit('waiting room', payload.msg)
    socket.broadcast.to("waiting room").emit('waiting room', payload.msg)
})

Wenn ich jetzt eine Nachricht an waiting room chat Sende, aber keine Steckdose in den Raum eingetreten ist, wird sie nicht empfangen. Aber welchen Vorteil hat die zweite Methode gegenüber der ersten?

5
A. Lau

Räume sind ein Tool in socket.io-Servern, um Gruppen verbundener Benutzer zu verfolgen. Sie können dann die Sockets in einem Raum iterieren oder an alle senden. Es gibt wirklich nichts mehr als das. Der Server kann einen Socket in einen Raum stecken oder einen aus einem Raum entfernen. Wenn eine Steckdose getrennt wird, wird sie automatisch aus allen Räumen entfernt, in denen sie sich befindet.

Jede Steckdose wird auch automatisch in einen Raum gestellt, dessen Name aus dem socket.id. Dadurch kann socket.io an jeden Socket senden, wenn Sie nur dessen ID haben.

Ihr Schema, bei dem nur Nachrichten verwendet werden und dann jeder Client entscheiden kann, welche Nachrichten abgehört werden sollen, ist ein clientgesteuertes Schema (der Client entscheidet, welche Nachrichten beachtet werden sollen) im Gegensatz zu einem servergesteuerten Schema, das wahrscheinlich nicht so gut skaliert weil Sie alle Nachrichten an alle Clients senden müssen, damit alle Clients die Möglichkeit haben, sie alle abzuhören. Räume hingegen sind ein servergesteuertes Schema, bei dem der Server (im Voraus) verfolgt, welche Sockets sich in welcher Gruppe befinden, und nur Nachrichten an die Clients sendet, die diese Nachrichten erhalten sollen. Der Server steuert die Dinge und erledigt sie effizienter.

In einigen Fällen können Sie es nicht dem Kunden überlassen, zu entscheiden, was er hören darf. Stellen Sie sich vor, Sie haben einen Chat-Server, der private 1-zu-1-Chat-Sitzungen einrichtet. In diesem Fall kann es nicht vorkommen, dass clientA Chat-Nachrichten für eine andere Chat-Sitzung abhören darf. Um dies zu erzwingen, muss der Server NUR Chatnachrichten an die paarweisen Teilnehmer senden. Dies ist eine Funktion, für die Zimmer sehr nützlich wären und für Ihr Schema nicht.

7
jfriend00

Räume sind ein logisches Gruppierungskonstrukt und bieten Entwicklern, die Websockets verwenden, viele Vorteile:

  1. Räume erleichtern die Übertragung an eine bestimmte Gruppe von Clients, ohne auf die einzelnen Socket-IDs jedes Clients Bezug zu nehmen.

  2. Ein Kunde kann sich in einem Raum befinden oder nicht, während er in Verbindung bleibt. Daher bieten Räume ein logisches "Abonnement" für die vom Server ausgestrahlten Veranstaltungsthemen/-kanäle.

  3. Einige Räume sind möglicherweise sogar geschützt oder erfordern höhere Zugriffsebenen. Dies kann auch simuliert werden, indem der Client eine Beitrittsanforderung mit Anmeldeinformationen sendet.

  4. In Multiplayer-Spielen entspricht jede Spielsitzung oder jeder Spielbereich/jede Spielzone logischerweise einem Raum.

  5. Wenn Sie einen Cluster von Serverinstanzen ausführen, können Räume (mithilfe von Socket.io-Bridge-Adaptern) sogar Clients gruppieren, die mit verschiedenen Serverinstanzen verbunden sind.

3
S.D.