【问题标题】:How to handle user and socket pairs with node.js + redis如何使用 node.js + redis 处理用户和套接字对
【发布时间】:2012-01-23 22:03:04
【问题描述】:

直截了当: 我正在使用 node.js、socket.io 和 redis 作为私人聊天系统。

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

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

【问题讨论】:

    标签: node.js redis socket.io


    【解决方案1】:

    更优雅的解决方案是让每个套接字都连接到通道用户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 可以连接到他的频道,从而验证会话(阅读更多:http://www.danielbaulig.de/socket-ioexpress/
    2. 连接时增加 redis 中 userID 的值(以便您知道该用户正在侦听的新连接),断开连接时减少 userID 值(以便您知道仍在侦听的连接数)。如果值为 0,那么您会向聊天发送一条消息,说明 userID 已离开(因为监听 userID 频道的连接数为 0)。

    当其他用户想要向 userID 发送消息时,他们不需要连接到 userID 通道,他们可以向chat 通道发送消息并将 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);
        }
      });
    

    【讨论】:

    • 如果多个用户想与同一个用户交谈怎么办?他们都将加入同一个频道。
    • 更新了我的消息,看底部。
    猜你喜欢
    • 2014-03-18
    • 2013-12-26
    • 2022-01-23
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2014-11-08
    • 2017-05-26
    相关资源
    最近更新 更多