当前位置: 首页 > 面试题库 >

如何使用Node.js + Redis处理用户和套接字对

齐阳
2023-03-14
问题内容

直截了当:我正在使用node.js,socket.io和Redis进行私人聊天系统。

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

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


问题答案:

一个更优雅的解决方案是使每个套接字都连接到通道userID,例如:

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);
    }
  });


 类似资料:
  • 问题内容: TLDR;如何在基于事件的编程模型中标识套接字。 我刚刚开始使用node.js,过去我在C ++和PHP sockets()中完成了大部分编码工作,所以node.js对我来说是非常新的东西。 在c ++中,我们可以通过编写主套接字(例如服务器)来侦听新的连接和更改,然后相应地处理这些连接,从而完成识别套接字的工作。 问题答案: 如果您在寻找实际的套接字而不是socket.io,那么它们

  • 终止TCP/IP连接的最佳方法是什么,该连接清理了系统上的开放套接字,但让远程方挂起。那就是我想要关闭一个插座的方式,对我来说是最低的成本,但对他们来说是最高的成本。 @尼古拉斯·威尔逊: 使用tcprepair似乎是个好主意。当套接字在TCP_REPAIR模式下关闭时,不会发送FIN或RST数据包。远程插座挂起。我要去试试看然后回去报告。下面是我的(未经测试的)代码: 只是不要关闭它。打开的插座

  • 我有一个Android应用程序,需要允许多个套接字通信。以下是相关的基本工作: 我的应用程序(说服务器)是一个将作为服务器套接字运行的服务。其他应用程序可以在预定义的端口上连接到它。可以有多个连接,例如客户端1、客户端2。 所以,当客户端1发送hello时,服务器将对此进行处理,并应将回复发送回客户端1。 目前我能够连接客户端1和客户端2的服务器。我已经为其创建了输入、输出缓冲区。但我不确定服务器

  • 我设法创建了基本的远程管理员工具,它运行良好,我使用了基本的tcp套接字和C++中的多线程。我可以用一些功能来远程使用它,这就像90%完成了,但我的软件没有任何东西可以检测客户端断开,除了当客户端手动关闭时,客户端会发送断开消息给服务器,但当用户拔掉网络插头或其他东西时,断开发生时,什么是最好的处理方法,我正在寻找一种专业的方法来做,比如如果客户端断开,服务器会立即检测到哪个客户端断开。

  • 问题内容: 由于共享主机,我的目标主机上的redis服务器不是在端口上运行,而是在非常特定的套接字上运行,该套接字可以通过套接字文件连接,只有我的用户可以访问。 但是,我还没有找到如何在and 包(我想使用的包)中通过套接字指定连接的方法。 有人知道怎么做吗? 问题答案: 更新: 我下面的回答不是真的正确。事实证明,我下面提到的问题中的解决方案实际上仍然有效。IMO,这更多是巧合,但是您可以执行以

  • 套接字接口 结构体 struct   fd_set   文件句柄管理 更多...   类型定义 typedef struct fd_set  fd_set   文件句柄管理   函数 int  socket (int domain, int type, int protocol)   创建套接字   int  bind (int s, const struct sockaddr *name, so