javascript - Administrar múltiples pestañas(pero el mismo usuario) en socket.io
node.js session (4)
Parece que puede estar refiriéndose al ID de socket en su pregunta, no al ID de sesión. Si tiene una sesión rápida, puede usar el ID de sesión, que será el mismo independientemente de cuántas pestañas estén abiertas, siempre que utilicen el mismo navegador y no esté en el modo "privado". Eche un vistazo a esta pregunta para saber cómo habilitar sesiones en socket.io.
Actualización: cuando esté guardando el ID de sesión, lo asociará con el apodo del usuario y los sockets conectados. Luego puedes recorrer cada socket y enviar el mensaje. Algo como lo siguiente:
[
{sessionId: ''12345'', nickname: ''timmay!'', socketIds: [1, 2, 3]},
{sessionId: ''23456'', nickname: ''pete'', socketIds: [4, 5, 6]}
]
Cuando se establece otra conexión, usted inserta el nuevo ID de socket en la matriz socketIds, y cuando un usuario se desconecta, elimina el ID.
Otra opción podría ser permitir solo una pestaña por usuario por sesión. Puede almacenar un solo socketId y cuando un nuevo socket se conecta para el mismo usuario, puede desconectar el socket original y usar el nuevo en su lugar.
Estoy teniendo algunos problemas con socket.io, y no tengo idea de cómo resolverlo. Tengo una aplicación con un sistema de inicio de sesión con socket.io para gestionar las interacciones de los usuarios. También tengo una matriz para gestionar todas las sesiones activas de websocket. Esta matriz almacena un par session.id => nombre de usuario.
Los problemas comienzan cuando un usuario abre una nueva pestaña con la misma página (o una página diferente que usa el websocket). Esto causa una entrada de nombre de usuario duplicada en la matriz.
{id1, username}
{id2, username}
Cuando socket envía un mensaje al usuario, envía solo al primer id de sesión de la matriz, por lo que solo una pestaña recibe el mensaje.
He intentado cambiar el ID de socket de la nueva conexión para que coincida con la otra, pero no funciona.
socket.id = sessionId of the other websocket;
Creo que otra solución es enviar el mensaje a todas las sesiones abiertas, pero creo que no es la mejor manera de hacerlo.
Gracias.
Puedes usar hash así:
var sessionHash = {};
sessionHash[''userName''] = socket;
y verifique en io.sockets.on(''connection'',..)
si existe un socket bajo esa clave.
Si lo hace, puede ejecutar sessionHash[''userName''].disconnect();
en él y guardar el zócalo a estrenar.
Sé que ha pasado mucho tiempo desde que preguntaste esto, pero hace solo 4 años publiqué un módulo para node js, express y socket.io que administra exactamente lo que querías. Compruebe el uso y el ejemplo. ¡Espero que este módulo le resulte útil!
Puede instalarlo a través de NPM socket.io.users Este es un módulo de nodo js para aplicaciones socket.io. Un usuario por cliente.
Algunos de los códigos de uso
var express = require(''express'');
var app = express();
var server = require(''http'').createServer(app);
var socketUsers = require(''socket.io.users'');
//....
socketUsers.Session(app);//IMPORTANT
//...
var rootIo = require(''socket.io'')(server); //default ''/'' as namespace.
var chatIo = rootIo.of(''/chat'');
var rootUsers = socketUsers.Users; /* default ''/'' as namespace.
Each namespace has IT''s OWN users object list,
but the Id of a user of any other namespace may
has the same value if request comes from the same client-machine-user.
This makes easy to keep a kind of
synchronization between all users of all different namespaces. */
var chatUsers = socketUsers.Users.of(''/chat''); //
rootIo.use(socketUsers.Middleware());/*IMPORTANT but no errors if you want
to skip it for a io.of(namespace)
that you don''t want the socket.io.users'' support. */
chatUsers.use(socketUsers.Middleware());
chatUsers.on(''connected'',function(user){
console.log(user.id + '' has connected to the CHAT'');
user.store.username = ''username setted by server side''; /*at the store
property you can store any type of properties
and objects you want to share between your user''s sockets. */
user.socket.on(''any event'', function(data){
/*user.socket is the current socket, to get all connected sockets from this
user, use: user.sockets */
});
chatIo.emit(''set username'',user.store.username);
});
rootUsers.on(''connected'',function(user){
console.log(''User has connected with ID: ''+ user.id);
});
rootUsers.on(''connection'',function(user){
console.log(''Socket ID: ''+user.socket.id+'' is user with ID: ''+user.id);
});
rootUsers.on(''disconnected'',function(user){
console.log(''User with ID: ''+user.id+''is gone away :('');
});
//...server.listen blabla..
La biblioteca de intercomunicación se puede utilizar para compartir y administrar una conexión socket.io.
// Initialize socket.io on one tab
var socket = io.connect(''//yourwebsite.com/socketio'');
// Initialize intercom on all tab
var intercom = Intercom.getInstance();
intercom.bind(socket);
// Listen to an event
intercom.on(''msgBroadcast'', function(data){
console.log(data);
});
// Emit an event
intercom.emit(''msgBroadcast'', {
socket: true,
message: ''Hello all!''
});
También puedes utilizar socketio webworkers compartidos.