管理socket.io多个选项卡(但同一用户)(Manage multiple tabs (but

2019-06-27 12:24发布

我有一些问题socket.io,我不知道如何解决它。 我有一个应用程序与socket.io登录系统来管理用户交互。 此外,我已经一个数组来管理所有活动的WebSocket会话。 该数组存储有一对session.id =>用户名。

当用户打开同一个页面(或不同的页面,它使用的WebSocket)的新选项卡的问题开始。 这导致在阵列中重复的用户名条目。

{id1, username}
{id2, username}

当插座将消息发送给用户,其发送仅到所述阵列的所述第一会话ID,因此,只有一个突片接收该消息。

我试图改变新的连接,以配合其它的套接字ID,但它不工作。

socket.id = sessionId of the other websocket;

我认为,另一种解决方案是将消息发送给所有的公开会议,但我认为这不是做到这一点的最好办法。

谢谢。

Answer 1:

这听起来像你可能是指插座的ID在你的问题,而不是会话ID。 如果你有一个明确的会话可以使用会话ID,这将是一样的,不管,只要他们使用相同的浏览器,它不是在“私人”模式多少标签是打开的。 看看这个问题,对于如何启用socket.io会议。

socket.io和会话?

更新:当你保存session ID,你会与用户的昵称和所连接的插座相关联。 然后你就可以通过每个插座迭代并发送邮件。 像下面这样:

[
    {sessionId: '12345', nickname: 'timmay!', socketIds: [1, 2, 3]},
    {sessionId: '23456', nickname: 'pete', socketIds: [4, 5, 6]}
]

当建立另一个连接你推新的socket ID为socketIds阵列,而当用户断开您删除ID。

另一种选择可能是只允许每个用户的每次会话一个标签。 您可以存储单个socketId,当一个新的socket为同一用户连接,您可以断开原始套接字,并使用新的来代替。



Answer 2:

您可以使用哈希这样的:

var sessionHash = {};
sessionHash['userName'] = socket;

并检查io.sockets.on('connection',..)插座是否该键下存在。

如果是这样,你可以执行sessionHash['userName'].disconnect(); 它并保存全新的插座。



Answer 3:

我知道这是一个漫长的时间,因为你问这一点,但就在4年前,我出版了节点JS模块,表达和socket.io其管理恰好的事情你想要的。 检查用法示例,我希望你会发现这个模块有帮助!

您可以通过NPM安装socket.io.users这是一个节点JS的socket.io应用模块。 每个客户端的一个用户。

一些使用代码

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..


Answer 4:

对讲库可用于共享和管理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!'
});

你也可以使用socketio共享webworkers



文章来源: Manage multiple tabs (but same user) in socket.io