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!
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.
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
});
J'utiliserais un objet comme recherche de hachage-cela vous évitera de boucler un tableau
var clients = {};
clients[customId] = clientId;
var lookup = clients[customId];
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);
...
}
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
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")
});
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);
});
`