Qual è il punto delle stanze in socket.io?

4

Mi stavo chiedendo quale sia lo scopo delle camere. Vedi: link

Puoi sostanzialmente imitare join e leave con solo socket.on e socket.off

Prendi ad esempio:

(nessuna stanza)

client:

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

Questo ora ascolterà "chat" e potrò disattivarlo utilizzando socket.off("chat")

Ora faccio qualcosa di simile ma con una stanza:

client:

// 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)
})

Ora se invio un messaggio a waiting room chat ma un socket non è entrato nella stanza, non lo riceverà. Ma quale vantaggio ha il secondo metodo rispetto al primo?

    
posta A. Lau 11.12.2017 - 05:55
fonte

2 risposte

6

Le stanze sono uno strumento nei server socket.io per tenere traccia dei gruppi di utenti connessi. È quindi possibile iterare le prese in una stanza o trasmetterle a tutti. Non c'è davvero niente di più per loro. Il server può inserire una presa in una stanza o rimuoverne una da una stanza. Quando un socket si disconnette, viene automaticamente rimosso da tutte le stanze in cui si trova.

Ogni socket viene automaticamente inserito in una stanza il cui nome è composto dalla sua socket.id . Ciò consente a socket.io di inviare a qualsiasi socket quando hai solo il suo id.

Il tuo schema per usare solo messaggi e quindi lasciare che ogni cliente decida quali messaggi ascoltare è uno schema guidato dal client (il client decide quali messaggi prestare attenzione) rispetto a uno schema guidato dal server e probabilmente non lo fa scala anche perché richiede di inviare tutti i messaggi a tutti i client in modo che tutti i clienti abbiano la possibilità di ascoltarli tutti. Le stanze, d'altra parte, sono uno schema basato su server in cui il server tiene traccia (in anticipo) di quali socket sono in quale gruppo e invia solo messaggi ai client che dovrebbero ricevere quei messaggi. Il server controlla entrambe le cose e lo fa in modo più efficiente.

Inoltre, in alcuni casi, non puoi lasciarlo al cliente per decidere cosa è permesso ascoltare. Immagina di avere un server di chat che imposta sessioni di chat private 1-on-1. In tal caso, non è possibile avere alcuna circostanza in cui clientA è autorizzato ad ascoltare i messaggi di chat per altre sessioni di chat. Per far rispettare ciò, il server deve inviare SOLO messaggi chat ai partecipanti a coppie. Questa è una funzione che le stanze sarebbero molto utili e il tuo schema non lo sarebbe.

    
risposta data 11.12.2017 - 07:45
fonte
3

Le stanze sono un costrutto logico di raggruppamento e hanno molti vantaggi immediati per gli sviluppatori che utilizzano websocket:

  1. Le stanze semplificano la trasmissione a un determinato gruppo di client, senza fare riferimento ai singoli ID socket di ciascun client.

  2. Un cliente può essere o non essere in una stanza, rimanendo connesso. Pertanto, le camere forniscono una "sottoscrizione" logica agli argomenti / canali dell'evento trasmessi dal server.

  3. Alcune stanze potrebbero essere addirittura protette o richiedere livelli di accesso più elevati, questo può anche essere simulato facendo in modo che il client invii una richiesta "join" con credenziali.

  4. Nei giochi multiplayer, ogni sessione di gioco o area / zona di gioco è logicamente equivalente a una stanza.

  5. Quando si esegue un cluster di istanze del server, le stanze (con l'aiuto degli adattatori bridge di socket.io) possono persino raggruppare i client connessi a diverse istanze del server.

risposta data 11.12.2017 - 11:05
fonte

Leggi altre domande sui tag