管理socket.io中的多个选项卡(但为同一用户)
Manage multiple tabs (but same user) in socket.io
我在socket.io上遇到了一些问题,我不知道如何解决。我有一个带有socket.io登录系统的应用程序来管理用户交互。此外,我有一个阵列来管理所有活动的websocket会话。此数组存储一对session.id=>用户名。
当用户打开具有相同页面(或使用websocket的不同页面)的新选项卡时,问题就开始了。这会导致数组中出现重复的用户名条目。
{id1, username}
{id2, username}
当套接字向用户发送消息时,它只向数组的第一个会话id发送消息,因此只有一个选项卡接收消息。
我试图更改新连接的套接字id以匹配另一个,但不起作用。
socket.id = sessionId of the other websocket;
我认为另一个解决方案是向所有公开会议发送信息,但我认为这不是最好的方法。
谢谢。
听起来你的问题中可能指的是套接字id,而不是会话id。如果你有一个快速会话,你可以使用会话id,无论打开多少个选项卡,只要它们使用相同的浏览器,并且不处于"专用"模式,会话id都是相同的。看看这个问题,了解如何在socket.io.中启用会话
socket.io和会话?
更新:保存会话id时,会将其与用户的昵称和连接的套接字相关联。然后,您可以遍历每个套接字并发送消息。类似以下内容:
[
{sessionId: '12345', nickname: 'timmay!', socketIds: [1, 2, 3]},
{sessionId: '23456', nickname: 'pete', socketIds: [4, 5, 6]}
]
当建立另一个连接时,您将新的套接字id推入socketIds数组,当用户断开连接时,将删除id。
另一个选项可能是每个会话只允许每个用户使用一个选项卡。您可以存储一个socketId,当一个新套接字为同一用户连接时,您可以断开原始套接字的连接,转而使用新套接字。
我知道你问这个问题已经很久了,但就在4天前,我发布了一个node js、express和socket.io的模块,它可以管理你想要的东西。查看用法和示例,我希望你会发现这个模块有帮助!
您可以通过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..
您可以使用这样的散列:
var sessionHash = {};
sessionHash['userName'] = socket;
并且在CCD_ 1上检查在该密钥下是否存在套接字。
如果是,则可以在其上执行sessionHash['userName'].disconnect();
并保存全新的套接字。
Intercom库可用于共享和管理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共享网络工作者
- React Native通过Navigator将用户输入数据传递到选项卡栏IOS中的组件
- 我们如何在互联网断开连接或用户关闭选项卡/浏览器时调用注销servlet
- 如何检测用户是否在同一会话中打开了多个窗口或选项卡
- PayPal按钮是否有一个简单的选项,其中金额基于一些用户输入
- 在用户关闭/更改移动浏览器选项卡之前进行检测
- 计算用户从多个文件中选择的选项数量
- 询问用户何时尝试关闭浏览器选项卡
- 在Chrome for iOS中,附加到用户代理字符串的唯一选项卡ID
- 管理socket.io中的多个选项卡(但为同一用户)
- 如何防止用户使用浏览器选项禁用脚本
- 当用户在选择框中选择选项时,使用window.location.href重定向用户只会更改导航器中URL的最后一位
- 当用户关闭浏览器选项卡时,如何使用 PHP 或 javascript 从我的站点注销用户
- 用户界面先前选择的选项选择更改
- 读取一个本地文件,编码为base64,我想给用户一个将结果保存到文件的选项
- 当用户单击时,在新选项卡中打开链接
- 多选项卡LocalStorage单用户用例
- 如何更改用户选项更改时中的Onchange事件中Visual Composer上的按钮(选择选项)
- PHP:如何根据数百个用户选项提供自定义内容
- 如何从用户选项url匹配在Content_Script
- 表单动作改变javascript用户选项选择