web-dev-qa-db-fra.com

Envoi de message à un identifiant spécifique dans Socket.IO 1.0

Je souhaite envoyer des données à un ID de socket spécifique.

Nous avions l'habitude de faire cela dans les anciennes versions:

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

Comment pourrais-je faire quelque chose de similaire dans Socket.IO 1.0?

79
user2283026

Dans socket.io 1.0, ils fournissent un meilleur moyen pour cela. Chaque socket rejoint automatiquement une pièce par défaut par son propre identifiant. Vérifier les documents: http://socket.io/docs/rooms-and-namespaces/#default-room

Vous pouvez donc émettre vers un socket par identifiant avec le code suivant:

io.to(socketid).emit('message', 'for your eyes only');
197
Mustafa Dokumacı

Dans socket.io 1.0, vous pouvez le faire avec le code suivant:

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

Mise à jour:

@ La réponse de Mustafa Dokumacı contient une meilleure solution.

92
Oleg

@Mustafa Dokumacı et @Curious ont déjà fourni suffisamment d'informations, j'ajoute comment vous pouvez obtenir un identifiant de socket.

Pour obtenir l’identifiant de la socket, utilisez socket.id:

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

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

Si vous avez utilisé un espace de noms, j'ai constaté que les opérations suivantes fonctionnent:

//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');

En savoir plus sur les espaces de noms: http://socket.io/docs/rooms-and-namespaces/

6
Meth

Je crois que @Curious et @ MustafaDokumacı ont fourni des solutions qui fonctionnent bien. La différence cependant est que, avec la solution de @ MustafaDokumacı, le message est diffusé dans une pièce et non pas uniquement vers un client particulier.

La différence est évidente lorsqu'un accusé de réception est demandé.

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

fonctionne comme prévu, tandis que

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

échoue avec

Error: Callbacks are not supported when broadcasting
5
Giannis Kosmas

dans Node.js -> socket.io -> il y a un exemple de chat à télécharger Collez cette pièce en ligne (io sur la connexion) .. j'utilise ce code qui fonctionne à 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);
  });
});
1
user2204339