Invio di un messaggio a un ID specifico in Socket.IO 1.0


85

Voglio inviare i dati a un ID socket specifico.

Eravamo in grado di farlo nelle versioni precedenti:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

Come potrei fare qualcosa di simile in Socket.IO 1.0?

Risposte:


206

In socket.io 1.0 forniscono un modo migliore per questo. Ogni socket si unisce automaticamente a una stanza predefinita per auto id. Controlla i documenti: http://socket.io/docs/rooms-and-namespaces/#default-room

Quindi puoi emettere su un socket tramite ID con il seguente codice:

io.to(socketid).emit('message', 'for your eyes only');

C'è differenza tra to (room_id) e (user_socket_id)? In realtà lo uso per inviare messaggi a una stanza virtuale che può avere uno o più utenti. "Questo semplifica la trasmissione di messaggi ad altri socket:", quindi può essere uno o più, non un unico privato.
Washington Botelho,

@WashingtonBotelho, gli ID socket di solito assomigliano a qualcosa come "Uj5CRqZ5b_Xubx9sAAAA", quindi in teoria potrebbe esserci più di un utente in tale stanza, ma in pratica non conosco casi in cui aggiungerei un utente alla stanza personale di un altro utente.
Oleg

9
Come possiamo identificare un utente specifico tramite il suo socketId, questo significa che dobbiamo memorizzare una coppia di valori chiave di utente (ad esempio-nomeutente) e socketId da qualche parte?
Sai

@Mustafa Dokumacı merhaba, bana bir Yardim et stackoverflow.com/questions/38817680/...
mahdi pishguy

È così poco logico ... perché non fornirci un modo per inviare un messaggio a un numero di ID socket e il gioco è fatto? Comunque votato in positivo, l'unico rimedio che funziona effettivamente su 2.x
Adry

94

In socket.io 1.0 puoi farlo con il seguente codice:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

Aggiornare:

La risposta di @ MustafaDokumacı contiene una soluzione migliore.


3
La differenza tra questa risposta e una risposta migliore indicata è che con QUESTA soluzione, puoi avere callback che è bello. Ma con io.to (socketid), NON puoi usare i callback.
Ramazan Polat

17

@Mustafa Dokumacı e @Curious hanno già fornito informazioni sufficienti, sto aggiungendo come puoi ottenere l'ID del socket.

Per ottenere l'ID socket utilizzare socket.id :

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}

6

Se hai usato uno spazio dei nomi ho scoperto che quanto segue funziona:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

Ulteriori informazioni sugli spazi dei nomi: http://socket.io/docs/rooms-and-namespaces/


5

Credo che sia @Curious che @ MustafaDokumacı abbiano fornito soluzioni che funzionano bene. La differenza però è che con la soluzione di @ MustafaDokumacı il messaggio viene trasmesso a una stanza e non solo a un particolare cliente.

La differenza è evidente quando viene richiesto un riconoscimento.

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

funziona come previsto, mentre

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

fallisce con

Error: Callbacks are not supported when broadcasting

1

in Node.js -> socket.io -> c'è un esempio di chat da scaricare Paste this in line (io on connection) part .. io uso questo codice che funziona al 100%

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
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.