Подтвердить что ты не робот

Идентификатор клиента Socket.io

Я делаю чат-приложение с socket.io, и я бы хотел использовать свой пользовательский идентификатор клиента вместо стандартных (8411473621394412707, 1120516437992682114). Есть ли способ отправить пользовательский идентификатор при подключении или просто использовать что-то для отслеживания пользовательского имени для каждого идентификатора? Спасибо!

4b9b3361

Ответ 1

Вы можете создать массив на сервере и сохранить на нем пользовательские объекты. Например, вы можете сохранить идентификатор, созданный Socket.io, и пользовательский идентификатор, отправленный каждым клиентом на сервер:

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

        });
    });

в этом примере вам нужно вызвать storeClientInfo для каждого клиента.

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

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

Надеюсь, что это поможет.

Ответ 2

Чтобы установить собственный идентификатор сокета, функция generateId должна быть перезаписана. Для управления этой операцией можно использовать как реквизиты eio, так и engine объекта Socket.io server.

Простой пример:

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

Похоже, это было обработано.

Следует помнить, что идентификатор сокета должен быть непредсказуемым и иметь уникальное значение с учетом безопасности и операций приложения!

Дополнительно: Если socket.id возвращается как undefined из-за интенсивных процессов в вашем методе generateId, комбинация async/await может быть использована для преодоления этой проблемы в node.js версии 7.6.0 и более поздних.
Метод handshake файла node_modules/engine.io/lib/server.js следует изменить следующим образом:

ток:

// engine.io/lib/server.js

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

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

новые:

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

Примечание. В Engine.io v4.0 метод generateId будет принимать обратный вызов. Так что не нужно менять метод handshake. Достаточно будет только замены метода generateId. Например:

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

Ответ 3

В новейшей версии socket.io(версия 1.x) вы можете сделать что-то вроде этого

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

Ответ 4

Я бы использовал объект как хэш-поиск - это спасет вас, перейдя через массив

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

var lookup = clients[customId];

Ответ 5

или вы можете переопределить идентификатор сокета, например:

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

      socket.id = "YOUR_CUSTOM_ID";
});

вы можете видеть под массивом:

io.sockets.sockets

Ответ 6

Не меняйте идентификаторы сокетов на свои собственные, он полностью разбивает систему Socket.io. Он будет терпеть неудачу, и вы не поймете, почему ваши клиенты не получают сообщения.

Ответ 7

почему не более простое решение, которое не требует поддержки массива подключенных клиентов и не переопределяет внутренний идентификатор сокета?

io.on("connection", (socket) => {
    socket.on('storeClientInfo', (data) => {
        console.log("connected custom id:", data.customId);
        socket.customId = data.customId;
    });

    socket.on("disconnect", () => {
        console.log("disconnected custom id:", socket.customId);
    })
});

Клиентская сторона

let customId = "your_custom_device_id";
socket.on("connect", () => {
    socket.emit('storeClientInfo', { customId: customId });
});

Ответ 8

Если вы пытаетесь использовать пользовательский идентификатор для связи с конкретным клиентом, вы можете сделать это

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

Ответ 9

Может хранить customId (пример userId) в формате объекта вместо цикла, это улучшит производительность во время соединения, отключит и извлечет socketId для испускания

`

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

Ответ 10

С "socket.io": "^2.2.0"

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