Socket.io ID client personnalisé

Je fais une application de chat avec socket.io, et je voudrais utiliser mon id client personnalisé, au lieu de ceux par défaut (8411473621394412707, 1120516437992682114). Existe-t-il des moyens d'envoyer l'identifiant personnalisé lors de la connexion ou simplement d'utiliser quelque chose pour suivre un nom personnalisé pour chaque identifiant? Merci!

24
demandé sur pmerino 2011-10-09 13:06:06

8 réponses

Vous pouvez créer un tableau sur le serveur et y stocker des objets personnalisés. Par exemple, vous pouvez stocker l'id créé par Socket.io et un ID 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 de 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 aide.

35
répondu oscarm 2011-10-11 03:15:47

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
répondu Salvador Dali 2014-07-30 08:43:25

J'utiliserais un objet comme recherche de hachage-cela vous évitera de boucler un tableau

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

var lookup = clients[customId];
5
répondu James Westgate 2014-03-12 00:03:00

Pour définir un ID de socket personnalisé, la fonction generateId doit être écrasée. Les deux eio et engine accessoires de Socket.io server objet peut être utilisé 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) {

    // listing the default namespace rooms
    console.log("rooms: ", io.nsps["/"].adapter.rooms);

})

La sortie de La console serait le suivant:
rooms: { '/#1': Room { sockets: { '/#1': true }, length: 1 } }

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

Il doit être à l'esprit que l'id de socket doit être imprévisible et une valeur unique en tenant compte de la sécurité et de l'application les opérations de!

Extra: Si socket.id est renvoyé en tant que 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.
handshake la méthode du fichier node_modules/engine.io/lib/server.js doit être modifiée comme suit:

Ex:

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

Nouveau:

Server.prototype.handshake = async function (transportName, req) {
  var id = await this.generateId(req);
  ...
}
4
répondu efkan 2017-02-28 06:08:46

Ne changez pas les ID de socket en ceux de votre choix, cela casse le Socket.io système de chambre entièrement. Il échouera silencieusement et vous n'aurez aucune idée de la raison pour laquelle vos clients ne reçoivent pas les messages.

3
répondu 2016-04-08 06:27:13

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.socket.sockets

2
répondu Aviram Net 2014-06-09 12:43:56

Si vous essayez d'utiliser un identifiant personnalisé afin de 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
répondu Ahmadposten 2017-02-15 15:38:03

Peut stocker customId (exemple userId) au format objet au lieu de For loop, cela améliorera les performances lors de la connexion, de la déconnexion et de la récupération de socketId pour l'émission de

`

 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
répondu partikles 2017-08-03 13:08:17