web-dev-qa-db-fra.com

ID client personnalisé Socket.io

Je crée une application de discussion avec socket.io et j'aimerais utiliser mon identifiant client personnalisé au lieu de celui par défaut (8411473621394412707, 1120516437992682114). Existe-t-il un moyen d'envoyer l'identifiant personnalisé lors de la connexion ou d'utiliser simplement quelque chose pour suivre un nom personnalisé pour chaque ID? Merci!

25
pmerino

Vous pouvez créer un tableau sur le serveur et y stocker des objets personnalisés. Par exemple, vous pouvez stocker l'identifiant créé par Socket.io et un identifiant personnalisé envoyé par chaque client au serveur:

var util = require("util"),
    io = require('/socket.io').listen(8080),
    fs = require('fs'),
    os = require('os'),
    url = require('url');

    var clients =[];

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

        socket.on('storeClientInfo', function (data) {

            var clientInfo = new Object();
            clientInfo.customId         = data.customId;
            clientInfo.clientId     = socket.id;
            clients.Push(clientInfo);
        });

        socket.on('disconnect', function (data) {

            for( var i=0, len=clients.length; i<len; ++i ){
                var c = clients[i];

                if(c.clientId == socket.id){
                    clients.splice(i,1);
                    break;
                }
            }

        });
    });

dans cet exemple, vous devez appeler storeClientInfo depuis chaque client.

<script>
    var socket = io.connect('http://localhost', {port: 8080});

    socket.on('connect', function (data) {
        socket.emit('storeClientInfo', { customId:"000CustomIdHere0000" });
    });
</script>

J'espère que cela t'aides.

39
oscarm

Dans le plus récent socket.io (version 1.x), vous pouvez faire quelque chose comme ceci

socket  = io.connect('http://localhost');

socket.on('connect', function() {
    console.log(socket.io.engine.id);     // old ID
    socket.io.engine.id = 'new ID';
    console.log(socket.io.engine.id);     // new ID
});
6
Salvador Dali

Pour définir un ID de socket personnalisé, la fonction generateId doit être remplacée. Les propriétés eio et engine de Socket.io server object peuvent être utilisées pour gérer cette opération. 

Un exemple simple: 

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.engine.generateId = function (req) {
    // generate a new custom id here
    return 1
}

io.on('connection', function (socket) {
    console.log(socket.id); // writes 1 on the console
})

Il semble que cela ait été géré.

Il ne faut pas oublier que l'ID de socket doit être imprévisible et une valeur unique pour la sécurité et les opérations de l'application!

Extra: Si socket.id est retourné sous la forme undefined en raison de vos processus intenses sur votre méthode generateId, la combinaison async/await peut être utilisée pour résoudre ce problème sur node.js version 7.6.0 et ultérieure. 
La méthode handshake du fichier node_modules/engine.io/lib/server.js doit être modifiée comme suit:

courant:

// engine.io/lib/server.js

Server.prototype.generateId = function (req) {
  return base64id.generateId();
};

Server.prototype.handshake = function (transportName, req) {
  var id = this.generateId(req);
  ...
}

nouveau:  

// function assignment

io.engine.generateId = function (req) {
  return new Promise(function (resolve, reject) {
    let id;
    // some intense id generation processes
    // ...
    resolve(id);
  });
};


// engine.io/lib/server.js

Server.prototype.handshake = async function (transportName, req) {
  var id = await this.generateId(req);
  ...
}

Remarque: À Engine.io v4.0 , la méthode generateId accepterait un rappel. Il n’aurait donc pas besoin de changer de méthode handshake. Seul le remplacement de la méthode generateId suffira. Par exemple:

io.engine.generateId = function (req, callback) {
  // some intense id generation processes
  // ...
  callback(id);
};
6
efkan

Je voudrais utiliser un objet comme une recherche de hachage - cela vous évitera de parcourir en boucle un tableau

var clients = {};
clients[customId] = clientId;

var lookup = clients[customId];
5
James Westgate

ou vous pouvez remplacer l'ID de socket, comme ceci:

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

      socket.id = "YOUR_CUSTOM_ID";
});

vous pouvez voir sous le tableau:

io.sockets.sockets

3
Aviram Net

Ne changez pas les identifiants de socket par ceux de votre choix, cela casse complètement le système de salle Socket.io. Cela échouera en silence et vous ne saurez pas pourquoi vos clients ne reçoivent pas les messages.

3
user5536767

Si vous essayez d'utiliser un identifiant personnalisé pour communiquer avec un client spécifique, vous pouvez le faire. 

io.on('connection', function(socket){
    socket.id = "someId"
    io.sockets.connected["someId"] = io.sockets.connected[socket.id];

    // them emit to it by id like this
    io.sockets.connected["someId"].emit("some message", "message content")
});
0
Ahmadposten

Peut stocker customId (exemple userId) au format objet au lieu de la boucle for; cela améliorera les performances lors de la connexion, de la déconnexion et de la récupération de socketId pour émettre 

`

 var userId_SocketId_KeyPair = {};
 var socketId_UserId_KeyPair = {};

_io.on('connection', (socket) => {
    console.log('Client connected');
    //On socket disconnect
    socket.on('disconnect', () => {
        // Removing sockets
        let socketId = socket.id;
        let userId = socketId_UserId_KeyPair[socketId];
        delete socketId_UserId_KeyPair[socketId];
        if (userId != undefined) {
            delete userId_SocketId_KeyPair[userId];
        }
        console.log("onDisconnect deleted socket with userId :" + "\nUserId,socketId :" + userId + "," + socketId);
    });

    //Store client info
    socket.on('storeClientInfo', function (data) {
        let jsonObject = JSON.parse(data);
        let userId = jsonObject.userId;
        let socketId = socket.id;
        userId_SocketId_KeyPair[userId] = socketId;
        socketId_UserId_KeyPair[socketId] = userId;
        console.log("storeClientInfo called with :" + data + "\nUserId,socketId :" + userId + "," + socketId);
    });
`
0
partikles