it-swarm.com.de

Benutzerdefinierte Socket.io-Client-ID

Ich mache eine Chat-App mit socket.io und möchte meine benutzerdefinierte Client-ID anstelle der Standard-ID (8411473621394412707, 1120516437992682114) verwenden. Gibt es Möglichkeiten, den benutzerdefinierten Bezeichner zu senden, wenn Sie eine Verbindung herstellen oder einfach einen Namen für jede ID nachverfolgen? Vielen Dank!

25
pmerino

Sie können ein Array auf dem Server erstellen und benutzerdefinierte Objekte darauf speichern. Sie können beispielsweise die von Socket.io erstellte ID und eine von jedem Client an den Server gesendete benutzerdefinierte ID speichern:

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;
                }
            }

        });
    });

in diesem Beispiel müssen Sie storeClientInfo von jedem Client aus aufrufen.

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

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

Hoffe das hilft.

39
oscarm

Im neuesten socket.io (Version 1.x) können Sie so etwas tun

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

Um die benutzerdefinierte Socket-ID festzulegen, muss die Funktion generateId überschrieben werden. Für die Verwaltung dieser Operation können sowohl eio- als auch engine-Requisiten des Socket.ioserver -Objekts verwendet werden. 

Ein einfaches Beispiel: 

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
})

Es scheint so gewesen zu sein.

Es muss bedacht werden, dass die Socket-ID unberechenbar und eindeutiger Wert sein muss, wenn die Sicherheit und die App-Vorgänge berücksichtigt werden!

Extra: Wenn socket.id aufgrund Ihrer intensiven Prozesse in Ihrer undefined-Methode als generateId zurückgegeben wird, kann async/await-Kombination verwendet werden, um dieses Problem in node.js Version 7.6.0 und höher zu beheben. 
Die handshake-Methode der node_modules/engine.io/lib/server.js-Datei sollte wie folgt geändert werden:

aktuell:

// engine.io/lib/server.js

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

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

Neu: 

// 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);
  ...
}

Hinweis: Bei Engine.io v4.0 würde die generateId-Methode einen Rückruf akzeptieren. Die handshake-Methode muss also nicht geändert werden. Nur die generateId-Methode wird ausreichend sein. Zum Beispiel:

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

Ich würde ein Objekt als Hash-Lookup verwenden - dies erspart Ihnen das Durchlaufen eines Arrays

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

var lookup = clients[customId];
5
James Westgate

oder Sie können die Socket-ID wie folgt überschreiben:

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

      socket.id = "YOUR_CUSTOM_ID";
});

sie können unter dem Array sehen:

io.sockets.sockets

3
Aviram Net

Ändern Sie die Socket-IDs nicht nach Ihren eigenen Wünschen, da das Socket.io-Raumsystem vollständig zerstört wird. Es schlägt im Hintergrund fehl und Sie haben keine Ahnung, warum Ihre Kunden die Nachrichten nicht erhalten.

3
user5536767

Mit "socket.io": "^2.2.0"

io.use((socket, next) => { io.engine.generateId = () => socket.handshake.query.token; next(null, true); });

0

Wenn Sie versuchen, eine benutzerdefinierte ID zu verwenden, um mit einem bestimmten Client zu kommunizieren, können Sie dies tun 

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

Kann customId (Beispiel userId) im Objektformat anstelle von for-Schleife speichern. Dadurch wird die Leistung beim Verbinden, Trennen und Abrufen von socketId zum Senden verbessert 

`

 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