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.

128voto

Jzapata Points 429

Dans nodejs, vous pouvez modifier directement le ws et ajouter des attributs personnalisés pour chaque client séparément. Vous disposez également d'une variable globale wss.clients qui peut être utilisé partout. Veuillez essayer le code suivant avec au moins deux clients connectés :

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
    server: httpsServer
});

wss.getUniqueID = function () {
    function s4() {
        return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
    }
    return s4() + s4() + '-' + s4();
};

wss.on('connection', function connection(ws, req) {
    ws.id = wss.getUniqueID();

    wss.clients.forEach(function each(client) {
        console.log('Client.ID: ' + client.id);
    });
});

Vous pouvez également passer des paramètres directement dans l'URL de connexion du client :

https://myhost:8080?myCustomParam=1111&myCustomID=2222

Dans la fonction de connexion, vous pouvez obtenir ces paramètres et les attribuer directement à votre ws client :

wss.on('connection', function connection(ws, req) {

    const parameters = url.parse(req.url, true);

    ws.uid = wss.getUniqueID();
    ws.chatRoom = {uid: parameters.query.myCustomID};
    ws.hereMyCustomParameter = parameters.query.myCustomParam;
}

67voto

Ankit Bisht Points 161

Vous pouvez simplement attribuer l'ID des utilisateurs à un tableau CLIENTS[], qui contiendra tous les utilisateurs. Vous pouvez envoyer directement un message à tous les utilisateurs comme indiqué ci-dessous :

var WebSocketServer = require('ws').Server,
    wss = new WebSocketServer({port: 8080}),
    CLIENTS=[];

wss.on('connection', function(ws) {
    CLIENTS.push(ws);
    ws.on('message', function(message) {
        console.log('received: %s', message);
        sendAll(message);
    });
    ws.send("NEW USER JOINED");
});

function sendAll (message) {
    for (var i=0; i<CLIENTS.length; i++) {
        CLIENTS[i].send("Message: " + message);
    }
}

13voto

Serhat Ates Points 424

Vous pouvez utiliser l'en-tête de demande 'sec-websocket-key'.

wss.on('connection', (ws, req) => {
  ws.id = req.headers['sec-websocket-key']; 

  //statements...
});

11voto

H Dog Points 2055

Cet extrait de code dans le serveur Worlize m'a beaucoup aidé. Même si vous utilisez ws, le code devrait être facilement adaptable. J'ai sélectionné les parties importantes ici :

// initialization
var connections = {};
var connectionIDCounter = 0;

// when handling a new connection
connection.id = connectionIDCounter ++;
connections[connection.id] = connection;
// in your case you would rewrite these 2 lines as
ws.id = connectionIDCounter ++;
connections[ws.id] = ws;

// when a connection is closed
delete connections[connection.id];
// in your case you would rewrite this line as
delete connections[ws.id];

Maintenant vous pouvez facilement créer une fonction broadcast() et sendToConnectionId() comme indiqué dans le code lié.

J'espère que cela vous aidera.

8voto

droid-zilla Points 36

Cela dépend du websocket que vous utilisez. Par exemple, le plus rapide, trouvé ici : https://github.com/websockets/ws est capable d'effectuer une diffusion via cette méthode :

var WebSocketServer = require('ws').Server,
   wss = new WebSocketServer({host:'xxxx',port:xxxx}),
   users = [];
wss.broadcast = function broadcast(data) {
wss.clients.forEach(function each(client) {
  client.send(data);
 });
};

Ensuite, plus tard dans votre code, vous pouvez utiliser wss.broadcast(message) pour envoyer à tous. Pour envoyer un MP à un utilisateur individuel, je fais ce qui suit :

(1) Dans mon message que j'envoie au serveur, j'inclus un nom d'utilisateur (2) Ensuite, dans onMessage, je sauvegarde la websocket dans le tableau avec ce nom d'utilisateur, puis je la récupère par nom d'utilisateur plus tard :

wss.on('connection', function(ws) {

  ws.on('message', function(message) {

      users[message.userName] = ws;

(3) Pour envoyer à un utilisateur particulier, vous pouvez alors faire users[userName].send(message) ;

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