在socket.io中pipe理多个选项卡(但同一用户)

我有一些socket.io的问题,我不知道如何解决它。 我有一个与socket.iologin系统的应用程序来pipe理用户交互。 另外我有一个数组来pipe理所有活动的websocket会话。 这个数组存储一个session.id =>用户名。

当用户使用相同的页面(或使用websocket的不同页面)打开新选项卡时,问题就开始了。 这会在数组中导致重复的用户名input。

{id1, username} {id2, username} 

当套接字向用户发送消息时,它只发送给数组的第一个会话ID,所以只有一个选项卡接收消息。

我试图改变新连接的套接字ID以匹配其他,但它不起作用。

 socket.id = sessionId of the other websocket; 

我认为另一个解决scheme是将信息发送给所有公开会议,但我认为这不是最好的方式。

谢谢。

这听起来像你可能指的是在你的问题的套接字ID,而不是会话ID。 如果您有快速会话,则可以使用会话ID,无论有多less个选项卡打开,只要它们使用相同的浏览器并且不处于“专用”模式即可。 看看这个问题,以了解如何在socket.io中启用会话。

socket.io和会话?

更新:当你保存会话ID,你会把它与用户的昵称和连接的套接字。 然后你可以迭代每个套接字并发送消息。 像下面这样:

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

当另一个连接build立时,将新的套接字标识插入到socketIds数组中,当用户断开连接时,将删除标识。

另一个选项可能是每个用户每个会话只允许一个选项卡。 你可以存储一个socketId,当一个新的套接字连接到同一个用户时,你可以断开原来的套接字并使用新套接字。

你可以使用这样的散列:

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

并检查io.sockets.on('connection',..)是否存在一个套接字下的密钥。

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

我知道你问了这个问题已经很长时间了,但是就在前4天,我发布了一个节点js,express和socket.io的模块,pipe理你想要的东西。 检查用法和例子,我希望你会发现这个模块有帮助!

您可以通过NPM来安装socket.io.users这是一个用于socket.io应用程序的节点js模块。 每个客户一个用户。

一些使用代码

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