Je crée une application de discussion avec socket.io et j'aimerais utiliser mon identifiant client personnalisé au lieu de celui par défaut (8411473621394412707
, 1120516437992682114
). Existe-t-il un moyen d'envoyer l'identifiant personnalisé lors de la connexion ou d'utiliser simplement quelque chose pour suivre un nom personnalisé pour chaque ID? Merci!
Vous pouvez créer un tableau sur le serveur et y stocker des objets personnalisés. Par exemple, vous pouvez stocker l'identifiant créé par Socket.io et un identifiant 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 depuis 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 t'aides.
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
});
Pour définir un ID de socket personnalisé, la fonction generateId doit être remplacée. Les propriétés eio
et engine
de Socket.io
server object peuvent être utilisées 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) {
console.log(socket.id); // writes 1 on the console
})
Il semble que cela ait été géré.
Il ne faut pas oublier que l'ID de socket doit être imprévisible et une valeur unique pour la sécurité et les opérations de l'application!
Extra: Si socket.id
est retourné sous la forme 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.
La méthode handshake
du fichier node_modules/engine.io/lib/server.js
doit être modifiée comme suit:
courant:
// engine.io/lib/server.js
Server.prototype.generateId = function (req) {
return base64id.generateId();
};
Server.prototype.handshake = function (transportName, req) {
var id = this.generateId(req);
...
}
nouveau:
// 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);
...
}
Remarque: À Engine.io v4.0 , la méthode generateId
accepterait un rappel. Il n’aurait donc pas besoin de changer de méthode handshake
. Seul le remplacement de la méthode generateId
suffira. Par exemple:
io.engine.generateId = function (req, callback) {
// some intense id generation processes
// ...
callback(id);
};
Je voudrais utiliser un objet comme une recherche de hachage - cela vous évitera de parcourir en boucle un tableau
var clients = {};
clients[customId] = clientId;
var lookup = clients[customId];
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.sockets.sockets
Ne changez pas les identifiants de socket par ceux de votre choix, cela casse complètement le système de salle Socket.io. Cela échouera en silence et vous ne saurez pas pourquoi vos clients ne reçoivent pas les messages.
Si vous essayez d'utiliser un identifiant personnalisé pour 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 la boucle for; cela améliorera les performances lors de la connexion, de la déconnexion et de la récupération de socketId pour émettre
`
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);
});
`