javascript - Administrar múltiples pestañas(pero el mismo usuario) en socket.io




node.js session (3)

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.

socket.io y sesion?

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.

https://code.i-harness.com

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.


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.





socket.io