gpt4 book ai didi

node.js - 如何使用 node.js + redis 处理用户和套接字对

转载 作者:IT王子 更新时间:2023-10-29 06:10:25 28 4
gpt4 key购买 nike

开门见山:我正在使用 node.js、socket.io 和 redis 作为私有(private)聊天系统。

连接用户将他的网站 ID (userID) 传递给 node.js 服务器。他可能有多个连接,所以我必须以某种方式将 socketID(每个连接的)和 userID 配对。我在考虑使用 redis 来存储 userID->sessionID 对。但是,当用户断开连接时,我需要从 redis 中删除那对。但我只有 socketID 而不是 userID,所以我无法通过该键进行选择。

现在,我是不是以错误的方式处理这个问题,还是应该同时存储 userID->socketID 和 socketID->userID 对?也许有人可以提供更优雅的解决方案?

最佳答案

一个更优雅的解决方案是让每个套接字连接到 channel 用户 ID,例如:

io.sockets.on('connection', function (socket) {
socket.join(userID);
});

// when you want somebody to send a message to userID you can do:
io.sockets.in(userID).emit(message);

这里有两件事你需要注意:

  1. 确保只有 userID 可以连接到他的 channel ,从而验证 session (阅读更多信息:http://www.danielbaulig.de/socket-ioexpress/)
  2. 在连接时增加 redis 中 userID 的值(以便您知道该用户的新连接正在监听)并在断开连接时减少 userID 值(以便您知道仍在监听的连接数)。如果该值为 0,则您向聊天发送一条消息,说明 userID 已离开(因为监听 userID channel 的连接数为 0)。

当其他用户想要向 userID 发送消息时,他们不需要连接到 userID channel ,他们可以向 chat channel 发送消息并将 userID 作为属性传递。例如:

var chat = io
.of('/chat')
.on('connection', function (socket) {
// connected to public chat
})
.on('message', function (data) {
if (data.userID && data.message) {
io.sockets.in(userID).emit('UserX: ' + data.message);
}
});

关于node.js - 如何使用 node.js + redis 处理用户和套接字对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8567015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com