web-dev-qa-db-fra.com

Comment envoyer un message à un client particulier avec socket.io

Je commence par socket.io + node.js, je sais comment envoyer un message localement et diffuser socket.broadcast.emit() fonction: - tous les clients connectés reçoivent le même message.

Maintenant, je voudrais savoir comment envoyer un message privé à un client particulier, je veux dire un socket pour une conversation privée entre 2 personnes (flux client à client). Merci.

80
Nizar B.

Lorsqu'un utilisateur se connecte, il doit envoyer un message au serveur avec un nom d'utilisateur qui doit être unique, comme un email.

Une paire de nom d'utilisateur et de socket doit être stockée dans un objet comme celui-ci:

var users = {
    '[email protected]': [socket object],
    '[email protected]': [socket object],
    '[email protected]': [socket object]
}

Sur le client, émettez un objet sur le serveur avec les données suivantes:

{
    to:[the other receiver's username as a string],
    from:[the person who sent the message as string],
    message:[the message to be sent as string]
}

Sur le serveur, écoutez les messages. Lorsqu'un message est reçu, envoyez les données au destinataire.

users[data.to].emit('receivedMessage', data)

Sur le client, écoutez les émissions du serveur appelé "receiveMessage", et en lisant les données, vous pouvez gérer l'origine et le message envoyé.

88
Adam

Vous pouvez utiliser les salles socket.io. Du côté client émettre un événement ("rejoindre" dans ce cas, peut être n'importe quoi) avec n'importe quel identifiant unique (email, id).

Côté client:

var socket = io.connect('http://localhost');
socket.emit('join', {email: [email protected]});

Maintenant, côté serveur, utilisez ces informations pour créer une pièce unique pour cet utilisateur.

Du côté serveur:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('join', function (data) {
    socket.join(data.email); // We are using room of socket io
  });
});

Ainsi, chaque utilisateur a maintenant rejoint une salle nommée d'après son courrier électronique. Donc, si vous voulez envoyer un message à un utilisateur spécifique, il vous suffit de

Du côté serveur:

io.sockets.in('[email protected]').emit('new_msg', {msg: 'hello'});

La dernière chose à faire du côté client est d'écouter l'événement "new_msg".

Côté client:

socket.on("new_msg", function(data) {
    alert(data.msg);
}

J'espère que vous avez l'idée.

230
az7ar

SURE: Simplement,

Voici ce dont vous avez besoin:

io.to(socket.id).emit("event", data);

chaque fois qu'un utilisateur rejoint le serveur, les détails du socket sont générés, y compris l'ID. C'est l'identifiant qui aide vraiment à envoyer un message à des personnes particulières.

nous devons d’abord stocker tous les socket.ids dans un tableau,

var people={};

people[name] =  socket.id;

ici nom est le nom du destinataire. Exemple:

people["ccccc"]=2387423cjhgfwerwer23;

Donc, maintenant nous pouvons obtenir ce socket.id avec le nom du destinataire chaque fois que nous envoyons un message:

pour cela, nous devons connaître le nom de destinataire. Vous devez émettre le nom du destinataire sur le serveur.

la dernière chose est:

 socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});

J'espère que cela fonctionne bien pour vous.

Bonne chance!!

25
Trojan

Vous pouvez vous référer à socket.io chambres . Lorsque vous avez une prise de contact, vous pouvez le joindre à la pièce nommée, par exemple "utilisateur. # {Utilisateur}".

Après cela, vous pouvez envoyer un message privé à n’importe quel client par nom commode, par exemple:

io.sockets.in ('user.125'). emit ('new_message', {text: "Hello world"})

Dans l'opération ci-dessus, nous envoyons "new_message" à l'utilisateur "125".

merci.

8
Vladimir Kurijov

Dans un projet de notre société, nous utilisons l'approche "salles" et son nom est une combinaison d'identifiants d'utilisateurs de tous les utilisateurs d'une conversation constituant un identifiant unique (notre implémentation s'apparente davantage à celle de Facebook messenger), par exemple:

| id | nom | 1 | Scott | 2 | Susan

"room" nom sera "1-2" (les identifiants sont ordonnés Asc.) et lors du débranchement socket.io nettoie automatiquement la pièce

de cette façon, vous envoyez des messages uniquement à cette salle et uniquement aux utilisateurs en ligne (connectés) (moins de paquets envoyés sur le serveur).

2
Rami

Permettez-moi de simplifier les choses avec les chambres socket.io. demander à un serveur avec un identifiant unique de rejoindre un serveur. Ici, nous utilisons un email comme identifiant unique.

Client Socket.io

socket.on('connect', function () {
  socket.emit('join', {email: [email protected]});
});

Lorsque l'utilisateur rejoint un serveur, créez une salle pour cet utilisateur.

Serveur Socket.io

io.on('connection', function (socket) {
   socket.on('join', function (data) {    
    socket.join(data.email);
  });
});

Nous sommes maintenant prêts à nous rejoindre. laisser émettre quelque chose à partir de la salle du serveur to, afin que l'utilisateur puisse écouter.

Serveur Socket.io

io.to('[email protected]').emit('message', {msg: 'hello world.'});

Finalisons le sujet en écoutant l'événement message du côté client

socket.on("message", function(data) {
  alert(data.msg);
});

La référence de Socket.io rooms

0
Lalit Mohan