102 votes

webSocketServer node.js comment différencier les clients

J'essaie d'utiliser les sockets avec node.js, j'ai réussi mais je ne sais pas comment différencier les clients dans mon code. La partie concernant les sockets est la suivante :

var WebSocketServer = require('ws').Server, 
    wss = new WebSocketServer({port: 8080});
wss.on('connection', function(ws) {
    ws.on('message', function(message) {
        console.log('received: %s', message); 
        ws.send(message);
    });
    ws.send('something');
});

Ce code fonctionne bien avec mon client js.

Mais je voudrais envoyer un message à un utilisateur particulier ou à tous les utilisateurs ayant des sockets ouverts sur mon serveur.

Dans mon cas, j'envoie un message en tant que client et je reçois une réponse mais les autres utilisateurs ne montrent rien.

Je voudrais par exemple que l'utilisateur 1 envoie un message au serveur via webSocket et que j'envoie une notification à l'utilisateur 2 qui a son socket ouvert.

4voto

J'utilise fd de l'objet ws. Il doit être unique par client.

var clientID = ws._socket._handle.fd;

J'obtiens un numéro différent lorsque j'ouvre un nouvel onglet du navigateur.

Le premier ws avait 11, le suivant 12.

3voto

rrkjonnapalli Points 79

Vous pouvez vérifier l'objet de connexion. Il possède une identification intégrée pour chaque client connecté ; vous pouvez la trouver ici :

let id=ws._ultron.id;
console.log(id);

2voto

cyberrspiritt Points 702

Une solution possible ici pourrait être d'ajouter le deviceId devant l'identifiant de l'utilisateur, de sorte que nous puissions séparer plusieurs utilisateurs avec le même identifiant mais sur des appareils différents.

ws://xxxxxxx:9000/userID/<<deviceId>>

0voto

Deepak Chaudhary Points 359

Par clients, vous entendez les connexions ouvertes, alors vous pouvez utiliser ws.upgradeReq.headers['sec-websocket-key'] comme identifiant. Et gardez tous les objets socket dans un tableau.

Mais si vous voulez identifier votre utilisateur, vous devrez ajouter des données spécifiques à l'utilisateur à l'objet socket.

0voto

Marko Balažic Points 396

Si quelqu'un ici utilise peut-être koa-websocket l'instance de serveur de WebSocket est attachée à la bibliothèque ctx à côté de la demande. Cela permet de manipuler très facilement le wss.clients Set (ensemble de sessions dans ws ). Par exemple, passer les paramètres par l'URL et l'ajouter à l'instance Websocket, comme ceci :

const wss = ctx.app.ws.server
const { userId } = ctx.request.query

try{

   ctx.websocket.uid = userId

}catch(err){
    console.log(err)
}

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