Я делаю чат-приложение с socket.io, и я бы хотел использовать свой пользовательский идентификатор клиента вместо стандартных (8411473621394412707
, 1120516437992682114
). Есть ли способ отправить пользовательский идентификатор при подключении или просто использовать что-то для отслеживания пользовательского имени для каждого идентификатора? Спасибо!
Идентификатор клиента Socket.io
Ответ 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); });