web-dev-qa-db-fra.com

socket.io message privé

J'ai raté le Net sans aucune chance. J'essaie de comprendre comment envoyer un message privé d'un utilisateur à un autre. Il y a beaucoup d'extraits, mais je ne suis pas sûr de l'interaction client/serveur. Si j'ai l'ID du socket que je veux envoyer, comment puis-je l'envoyer au serveur et comment puis-je m'assurer que le serveur n'envoie que le message à ce socket récepteur?

Existe-t-il un tutoriel ou une procédure à suivre connue?

17
Trevor Newhook

Aucun tutoriel nécessaire. Le Socket.IO FAQ est assez simple sur celui-ci:

socket.emit('news', { hello: 'world' });

EDIT: Les gens sont liés à cette question lorsqu'ils demandent comment obtenir cet objet socket plus tard. Il n'y a pas besoin de. Lorsqu'un nouveau client se connecte, enregistrez une référence à ce socket sur l'objet sur lequel vous conservez les informations de l'utilisateur. Mon commentaire ci-dessous:

Dans la partie supérieure de votre script, configurez un objet pour contenir les informations de vos utilisateurs.

var connectedUsers = {};

Dans votre fonction .on('connection'), ajoutez ce socket à votre nouvel objet. connectedUsers[USER_NAME_HERE] = socket; Ensuite, vous pourrez facilement le récupérer plus tard. connectedUsers[USER_NAME_HERE].emit('something', 'something');

29
Brad

Voici un extrait de code qui devrait aider

Côté client (envoi du message)

   socket.emit("private", { msg: chatMsg.val(), to: selected.text() });

où 'to' fait référence à l'id auquel envoyer un message privé et où 'msg' correspond au contenu

Côté client (réception du message)

   socket.on("private", function(data) {    
   chatLog.append('<li class="private"><em><strong>'+ data.from +' -> '+ data.to +'</strong>: '+ data.msg +'</em></li>');

où chatLog est un div affichant les messages de discussion

Du côté serveur

   client.on("private", function(data) {        
        io.sockets.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg });
   client.emit("private", { from: client.id, to: data.to, msg: data.msg });
   });
19
almypal

Le moyen le plus simple auquel je puisse penser est d’avoir un hachage de tous les utilisateurs qui utilisent leur identifiant ou leur nom comme clé et leur socket comme partie intégrante de la valeur, puis, lorsque vous voulez leur envoyer un message, vous tirez ce socket et émettre dessus ... quelque chose comme ça:

users[toUser].emit('msg',"Hello, "+toUser+"!");
6
Matthew Clark

in socket.io 1.0 utilisation

io.sockets.connected[<socketid>]

vous pouvez stocker uniquement l'identifiant de la socket. ainsi:

var users = {};
users[USER_NAME] = socket.id;

puis:

io.sockets.connected[users[USER_NAME]]
   .emit('private', {
       msg:'private message for user with name '+ USER_NAME
   });
1
user3506100

si vous avez un site Web qui a enregistré des utilisateurs avec uid, vous pouvez créer une salle pour chaque utilisateur et nommer la salle par uid de l'utilisateur.

connectez d'abord le client au serveur en utilisant:

var socket = io('server_url');

côté serveur, créez un événement pour détecter la connexion client:

io.on('connection', function (socket) {}

alors vous pouvez émettre au client à l'intérieur en utilisant socket.emit(); et demander à l'utilisateur actuel.

côté client, créez un événement pour cette demande, puis envoyez l'ID utilisateur au serveur.

maintenant, côté serveur, joignez le socket connecté à la pièce en utilisant:

socket.join(uid);
console.log('user ' + socket.user + ' connected \n');

maintenant vous pouvez envoyer un message privé à un utilisateur en utilisant la ligne suivante:

io.to(uid).emit();

si vous utilisez le code ci-dessus, peu importe le nombre d'onglets que l'utilisateur a déjà ouvert à partir de votre site Web. chaque onglet se connecte à la même pièce.

1
Ali_Hr

Bien que nous ayons de bonnes réponses ici. Cependant, je ne pouvais pas saisir assez rapidement l'identifiant unique d'utilisateur du serveur client. Je publie donc cette procédure simple afin d'aider quiconque se débat comme je le faisais .....

Sur le côté client, obtenez l'ID de l'utilisateur, dans mon cas, je reçois le nom d'utilisateur ...

Enregistrement de l'utilisateur côté client

//Connect socket.io     
var systemUrl = 'http://localhost:4000';
var socket = io.connect(systemUrl);

//Collect User identity from the client side
var username = Prompt('Enter your Username');
socket.emit('register',username);

L'écoute à enregistrer côté serveur pour enregistrer le socket de l'utilisateur sur le socket connecté

Code service côté Enregistrement de l'utilisateur

/*Craete an empty object to collect connected users*/
var connectedUsers = {};

io.on('connection',function(socket){

/*Register connected user*/
    socket.on('register',function(username){
        socket.username = username;
        connectedUsers[username] = socket;
    });
});

Envoyer un message du côté client

$(document).on('click','.username',function(){
    var username = $(this).text(),
        message = Prompt("type your message");

    socket.emit('private_chat',{
        to : username,
        message : message
    });
});

Recevoir un message sur le serveur et l’émettre à un utilisateur privé

/*Private chat*/
socket.on('private_chat',function(data){
    const to = data.to,
            message = data.message;

    if(connectedUsers.hasOwnProperty(to)){
        connectedUsers[to].emit('private_chat',{
            //The sender's username
            username : socket.username,

            //Message sent to receiver
            message : message
        });
    }

}); 

Recevoir un message sur le client et l'afficher

/*Received private messages*/
socket.on('private_chat',function(data){
    var username = data.username;
    var message = data.message;

    alert(username+': '+message);
});

Ce n'est pas le meilleur, mais vous pouvez commencer à partir d'ici ....

0