115 votes

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

Je commence avec socket.io + node.js, je sais comment envoyer un message localement et le 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 un chat privé entre 2 personnes (flux Client-To-Client). Merci.

313voto

az7ar Points 1147

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

Côté client :

var socket = io.connect('http://localhost');
socket.emit('join', {email: user1@example.com});

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

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
  });
});

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

Côté serveur :

io.sockets.in('user1@example.com').emit('new_msg', {msg: 'hello'});

La dernière chose qui reste à 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 comprenez l'idée.

110voto

Adam Points 865

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

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

var users = {
    'userA@example.com': [socket object],
    'userB@example.com': [socket object],
    'userC@example.com': [socket object]
}

Sur le client, émettez un objet vers 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, émet les données vers le récepteur.

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

Sur le client, écoutez les émissions du serveur appelées 'receivedMessage', et en lisant les données, vous pouvez gérer l'identité de l'expéditeur et le message qui a été envoyé.

43voto

Trojan Points 825

SURE : Tout simplement,

C'est ce dont vous avez besoin :

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

chaque fois qu'un utilisateur se connecte au serveur, les détails du socket sont générés, y compris l'ID. C'est l'ID qui permet d'envoyer un message à des personnes particulières.

Nous devons d'abord stocker tous les ids de socket dans un tableau,

var people={};

people[name] =  socket.id;

ici le nom est le nom du récepteur. Exemple :

people["ccccc"]=2387423cjhgfwerwer23;

Ainsi, nous pouvons maintenant obtenir ce socket.id avec le nom du récepteur lorsque nous envoyons un message :

pour cela nous avons besoin de connaître le nom du destinataire. Vous devez émettre le nom du récepteur vers 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 !

13voto

Vladimir Kurijov Points 275

Vous pouvez vous référer à socket.io chambres . Lorsque vous avez serré la main d'une douille, vous pouvez la joindre à une pièce nommée, par exemple. user.#{userid} .

Après cela, vous pouvez envoyer un message privé à n'importe quel client en utilisant le nom qui lui convient, 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.

6voto

Rami Points 61

Dans un projet de notre entreprise, nous utilisons l'approche des "rooms", dont le nom est une combinaison des identifiants de tous les utilisateurs d'une conversation en tant qu'identifiant unique (notre mise en œuvre ressemble davantage à celle de facebook messenger), par exemple :

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

Le nom de la "chambre" sera "1-2" (les identifiants sont classés par ordre ascendant) et lors de la déconnexion, socket.io nettoie automatiquement la chambre.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X