您能告诉我如何解决socket.io
浏览器中所有打开的选项卡的身份保存问题吗?
例子:
我打开了一个页面(/index
例如 ),我将其设置为连接socket.io
并获取唯一的会话 ID。但是当我在另一个选项卡上打开同一页面时 - ID 会创建另一个,也就是说,已经有两个化合物具有两个不同的 ID。没错,这是合乎逻辑的。但是,我需要在所有选项卡(包括绑定到user_id
)中同时向这些 ID 发送消息,并且因为会话 ID 不同 - 这是不可能的。
如果您不想(或不能)使用某种会话存储,并且想要将消息发送到具有相同 user_id 的多个套接字,则可以存储一个以 user_id 作为键的映射和一个套接字数组作为值
var socketMap = {};
并使用您的握手数据存储对套接字的引用
io.sockets.on('connection', function (socket) {
var userId = socket.handshake.userId;
if(!socketMap[userId]) socketMap[userId] = [];
socketMap[userId].push(socket);
});
或者用一些正常的事件数据
socket.on('auth', function(data) {
var userId = data.userId;
var authToken = data.authToken;
... // verify the data...
if(!socketMap[userId]) socketMap[userId] = [];
socketMap[userId].push(socket);
});
当您想要一个套接字列表发送消息时
var sockets = socketMap['some_user_id'];
socket的ID在任何情况下都是不同的,在任何情况下都不应该用来识别用户。它仅用于识别自己的 Socket。
您正在寻找的是会话。将套接字连接与会话相关联的能力 - 是您正在寻找的。为此,您需要为新的 http 连接创建会话,并在 socket.io 的握手过程中恢复此会话。这样,您将能够识别该特定套接字属于特定会话。
然后是用户数据和您保持会话的其他内容。这在许多情况下都有帮助 - 在页面刷新时恢复会话或根据需要在多个选项卡中使用单个会话。
阅读有关如何从握手过程中恢复 socket.io 会话 ID 的答案:http ://www.danielbaulig.de/socket-ioexpress/