Nuestro grupo especializado pasados algunos días de investigación y de recopilar de datos, han obtenido la respuesta, esperamos que todo este artículo sea de utilidad para tu plan.
Solución:
Puedes crear un array en el servidor y almacenar objetos personalizados en él. Por ejemplo, podría almacenar la identificación creada por Socket.io y una identificación personalizada enviada por cada cliente al servidor:
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
en este ejemplo, debe llamar storeClientInfo de cada cliente.
Espero que esto ayude.
Para establecer una identificación de socket personalizada, se debe sobrescribir la función generateId. Ambos eio
y engine
accesorios de Socket.io
servidor El objeto se puede utilizar para administrar esta operación.
Un ejemplo sencillo:
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
)
Parece ser que ha sido manejado.
Debe tenerse en cuenta que la identificación del socket debe ser impredecible ¡y un valor único considerando la seguridad y las operaciones de la aplicación!
Extra: Si socket.id
se devuelve como undefined
por tus intensos procesos en tu generateId
método, async/await
combinación se puede utilizar para superar este problema en node.js
versión 7.6.0 y posteriores. handshake
método de node_modules/engine.io/lib/server.js
El archivo debe cambiarse de la siguiente manera:
Actual:
// engine.io/lib/server.js
Server.prototype.generateId = function (req)
return base64id.generateId();
;
Server.prototype.handshake = function (transportName, req)
var id = this.generateId(req);
...
nuevo:
// 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);
...
Nota: En Engine.io v4.0, generateId
El método aceptaría una devolución de llamada. Así que no sería necesario cambiar handshake
método. Solo generateId
el reemplazo del método será suficiente. Por ejemplo:
io.engine.generateId = function (req, callback)
// some intense id generation processes
// ...
callback(id);
;
En el socket.io más nuevo (versión 1.x) puedes hacer algo como esto
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
);
Si eres capaz, tienes el poder dejar una sección acerca de qué le añadirías a esta división.