Envoi d'un message à un ID spécifique dans Socket.IO 1.0

85

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

Nous pouvions le faire dans les anciennes versions:

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

Comment procéder pour faire quelque chose de similaire dans Socket.IO 1.0?


la source

Réponses:

206

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

Vous pouvez donc émettre sur une socket par identifiant avec le code suivant:

io.to(socketid).emit('message', 'for your eyes only');
Mustafa Dokumacı
la source
Il y a une différence entre to (room_id) et (user_socket_id)? Je l'utilise en fait pour envoyer un message à une salle qui peut avoir un ou plusieurs utilisateurs. "Cela facilite la diffusion de messages vers d'autres sockets:", alors peut être un ou plusieurs, pas un privé unique.
Washington Botelho
@WashingtonBotelho, les ID de socket ressemblent généralement à "Uj5CRqZ5b_Xubx9sAAAA", donc en théorie, il peut y avoir plus d'un utilisateur dans une telle salle, mais en pratique, je ne connais aucun cas où j'ajouterais un utilisateur à la salle personnelle d'un autre utilisateur.
Oleg
9
Comment pouvons-nous identifier un utilisateur spécifique par leur socketId, cela signifie-t-il que nous devons stocker une paire clé / valeur d'utilisateur (pour eg-username) et socketId quelque part?
Sai
@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/…
mahdi pishguy
C'est tellement illogique ... pourquoi ne pas nous fournir simplement un moyen d'envoyer un message à un numéro d'identification de socket et c'est tout? Quoi qu'il en soit, le seul travail autour de qui fonctionne réellement sur 2.x
Adry
94

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 @ MustafaDokumacı contient une meilleure solution.

Oleg
la source
3
La différence entre cette réponse et une meilleure réponse pointée est qu'avec CETTE solution, vous pouvez avoir des rappels, ce qui est bien. Mais avec io.to (socketid), vous NE POUVEZ PAS utiliser les rappels.
Ramazan Polat
17

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

Pour obtenir l'ID de socket, utilisez socket.id :

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

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

Si vous avez utilisé un espace de noms, j'ai trouvé que ce qui suit fonctionne:

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

Meth
la source
5

Je pense que @Curious et @ MustafaDokumacı ont fourni des solutions qui fonctionnent bien. La différence cependant est qu'avec la solution de @ MustafaDokumacı, le message est diffusé dans une salle et pas seulement à un client particulier.

La différence est importante 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
Giannis Kosmas
la source
1

dans Node.js -> socket.io -> il y a un exemple de chat à télécharger Collez ceci en ligne (io sur connexion) partie .. 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);
  });
});
user2204339
la source