camere socket.io o spazio dei nomi?


163

Sto studiando nodejs / socket.io per chat in tempo reale e ho bisogno di consigli per implementare le stanze.

Cosa c'è di meglio, usando lo spazio dei nomi o usando la funzione room per isolare completamente trappole di chiacchiere?

qual è la vera differenza tecnica tra stanze e spazio dei nomi?

C'è qualche differenza nell'uso delle risorse?

Risposte:


216

Questo è ciò che gli spazi dei nomi e le stanze hanno in comune (socket.io v0.9.8 - si noti che la v1.0 comportava una riscrittura completa, quindi le cose potrebbero essere cambiate):

  • Entrambi gli spazi dei nomi ( io.of ('/ nsp') ) e le stanze ( socket.join ('room') ) vengono creati sul lato server
  • Più spazi dei nomi e più stanze condividono la stessa connessione (WebSocket)
  • Il server trasmetterà i messaggi via cavo solo ai client che si sono connessi a / si sono uniti a una nsp / room, ovvero non si tratta solo di un filtro sul lato client

Le differenze :

  • gli spazi dei nomi sono collegati dal client usando io.connect(urlAndNsp)(il client verrà aggiunto a quello spazio dei nomi solo se esiste già sul server)
  • le sale possono essere unite solo dal lato server (anche se la creazione di un'API sul lato server per consentire ai client di unirsi è semplice)
  • gli spazi dei nomi possono essere protetti da autorizzazione
  • l'autorizzazione non è disponibile con le sale , ma è possibile aggiungere un'autorizzazione personalizzata all'API di cui sopra, facile da creare sul server, nel caso in cui si sia disposti a utilizzare le sale
  • le stanze fanno parte di uno spazio dei nomi (impostazione predefinita allo spazio dei nomi "globale")
  • gli spazi dei nomi sono sempre radicati nell'ambito globale

Per non confondere il concetto con il nome (stanza o spazio dei nomi), userò compartimento per fare riferimento al concetto e gli altri due nomi per le implementazioni del concetto. Quindi se tu

  • necessita dell'autorizzazione per compartimento , gli spazi dei nomi potrebbero essere il percorso più semplice da prendere
  • se si desidera compartimenti a strati gerarchici (massimo 2 strati), utilizzare una combinazione spazio dei nomi / stanza
  • se l'app sul lato client è composta da parti diverse che (a loro volta non interessano gli scomparti ma) devono essere separate l'una dall'altra, utilizzare gli spazi dei nomi.

Un esempio per quest'ultima potrebbe essere un'app client di grandi dimensioni in cui moduli diversi, forse sviluppati separatamente (ad esempio di terze parti), ciascuno con socket.io indipendente, vengono utilizzati nella stessa app e vogliono condividere una singola connessione di rete.

Non avendo effettivamente analizzato questo, mi sembra che nel tuo progetto siano necessari solo semplici scomparti per separare e raggruppare i messaggi, uno dei due va bene.

Non sono sicuro che questo risponda alla tua domanda, ma la ricerca che ha portato a questa risposta mi ha almeno aiutato a vedere più chiaramente.


5
C'è qualcosa di grave che è cambiato in questo dopo la versione socket.io> = 1.0?
Xeroxoid,

2
Modifiche nell'ultima versione, leggi socket.io/docs/rooms-and-namespaces e questa risposta può essere utile per capire le cose delle stanze stackoverflow.com/questions/24041220/…
Gonzalo Bahamondez,

1
Possiamo dire che lo spazio dei nomi è una determinata area della mia app Web e room un gruppo di client in quella zona?
Onaiggac,

Puoi aggiungere qualcosa quando ti disconnetti da una stanza / spazio dei nomi. Cosa succede loro quando il client si disconnette o perde temporaneamente la connessione. Qui è scritto: Al momento della disconnessione, le prese lasciano tutti i canali di cui facevano parte automaticamente e non è necessario alcun abbattimento da parte vostra. Un canale è uguale al tuo compartimento ?
Appassisci il

67

È una vecchia domanda ma dopo aver fatto qualche ricerca sull'argomento trovo che la risposta accettata non sia chiara su un punto importante. Secondo lo stesso Guillermo Rauch ( vedi link ): sebbene sia teoricamente possibile creare dinamicamente spazi dei nomi su un'app in esecuzione, li usi principalmente come sezioni separate predefinite della tua applicazione. Se, d'altra parte, è necessario creare compartimenti ad hoc, al volo, per ospitare gruppi di utenti / connessioni, è meglio usare le stanze.


3
Mi piace! Spazi dei nomi: connessioni predefinite. Stanze - Collegamenti dinamici
Nandakumar,

16

Dipende da cosa vuoi fare.

La differenza principale è che le stanze sono più difficili da implementare. È necessario creare un metodo per unire le stanze ad ogni ricarica della pagina.

Con gli spazi dei nomi devi solo scrivere var example = io.connect('http://localhost/example');nel tuo client javascript e il client viene automaticamente aggiunto negli spazi dei nomi.

Esempio di utilizzo:

  • stanze: chat privata.
  • namespace: la chat della pagina.

2

Le stanze e gli spazi dei nomi segmentano la comunicazione e raggruppano le singole prese.

Una trasmissione in una stanza o in uno spazio dei nomi non raggiungerà tutti solo i membri.

La differenza tra spazi dei nomi e stanze è la seguente:

  • Namespace: sono gestiti nel frontend, ovvero l'utente o un utente malintenzionato si unisce al frontend e qui si gestiscono l'unione e la disconnessione.
  • Stanze: sono gestite nel back-end, il che significa che il server assegna l'unione e l'uscita dalle stanze.

La differenza è principalmente chi li gestisce

Per decidere cosa utilizzare è necessario decidere se la segmentazione deve essere gestita nel frontend o nel backend


0

Gli spazi dei nomi consentono di creare oggetti con lo stesso nome, ma sarebbero separati in quanto vivranno in spazi dei nomi diversi, altrimenti noti come ambiti.

Questo è lo stesso processo di pensiero che dovresti avere con gli spazi dei nomi Socket.IO. Se stai creando un'applicazione web Node modulare, vorrai spaziare i nomi dei diversi moduli. Se guardi indietro al nostro codice dello spazio dei nomi, vedrai che siamo stati in grado di ascoltare gli stessi eventi esatti in spazi dei nomi diversi. In Socket.IO, l'evento di connessione sulla connessione predefinita e l'evento di connessione su uno spazio dei nomi / xxx sono diversi. Ad esempio, se avevi una chat e un sistema di commenti sul tuo sito e volevi che entrambi fossero in tempo reale, puoi spaziare su ciascuno di essi. Ciò consente di creare un'intera applicazione Socket.IO che vive solo nel proprio contesto.

Ciò sarebbe anche vero se si stesse costruendo qualcosa da confezionare e installare. Non puoi sapere se qualcuno sta già utilizzando determinati eventi nello spazio dei nomi predefinito, quindi dovresti crearne uno tuo e ascoltarlo lì. Ciò ti consente di non calpestare tutti gli sviluppatori che usano il tuo pacchetto.

I namespace ci consentono di creare connessioni in contesti diversi. Possiamo paragonarlo a stanze, che ci consentono di raggruppare connessioni insieme. Possiamo quindi avere la stessa connessione anche in altre stanze.

Gli spazi dei nomi consentono di creare contesti diversi in cui Socket.IO può funzionare. Le sale consentono di raggruppare le connessioni client all'interno di tali contesti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.