当前位置: 首页 > 知识库问答 >
问题:

在reconnect、socket.io、node.js上重用套接字id

亢琦
2023-03-14

是否可以重用socket.id或多次使用它?

假设一个用户在不同的浏览器选项卡中查看同一站点的多个页面。我想使用一个socket.id,socket来处理它们。

如果用户收到通知,它应该在所有选项卡上弹出一个单一的socket.emit。

共有1个答案

冯育
2023-03-14

从以前的响应日期来看,我认为在socket.io的早期版本中可能不可能这样做,但我可以确认,在与socket.io 2.3.0的重新连接上,我成功地重用了套接字ID。

您只需要重写io.engine.generateID。无论该方法返回什么,都将是分配给套接字的id。以下是关于GenerateID的文档。

就我自己的实验而言,调用该方法时有两种情况。在连接和重新连接期间。

方法io.engine.GenerateID接收原始请求对象作为参数,因此我们可以使用它来确定是要重用id还是要获得一个新的id。

作为一个示例,我将展示如何重用从客户机发送的id,或者在客户机没有发送时创建一个新的id。id将在握手请求中作为查询参数socketid发送。

首先,您需要重写io.engine.generateID,这是分配ID的方法。在服务器上,您需要执行这样的操作。

const url = require('url')
const base64id = require('base64id')

io.engine.generateId = req => {
  const parsedUrl = new url.parse(req.url)
  const prevId = parsedUrl.searchParams.get('socketId')
  // prevId is either a valid id or an empty string
  if (prevId) {
    return prevId
  }
  return base64id.generateId()
}

这样,每当在握手请求中发送查询参数socketid时,它将被设置为套接字ID。如果您不发送它,您将使用base64id生成一个新的。特别使用该库的原因是,原始方法就是这样做的。在这里你可以找到源代码。

一旦有了它,就需要从客户机发送socketid参数。这在文档中有描述。

const socket = io.connect(process.env.WEBSOCKET_URL, {
  query: {
    socketId: existingSocketId || ''
  }
})

process.env.websocket_url将是web套接字侦听的URL。

请注意,这将在连接时工作,但您可能希望在重新连接时更新查询。

在文档的同一部分中,它解释了如何在重新连接之前更新查询参数。你只需要做这样的事。

socket.on('reconnect_attempt', () => {
  socket.io.opts.query = {
    socketId: existingSocketId || ''
  }
});

就像这样,只要是从客户端发送的套接字id,您就可以重用相同的套接字id。

信任从客户端发送的信息来分配套接字ID可能是个坏主意。我建议发送一个加密签名的有效负载,将该有效负载存储在客户机中,并在连接和重新连接时将其发送回服务器。这样,服务器就可以通过验证签名来检查有效负载是否可信。

使用上面的相同示例,我们将向客户机发送如下内容,可能是.on('connect'):

{
  socketId: 'foo',
  signature: SHA_256('foo' + VERY_SECRET_PASSWORD)
}

客户机将存储该有效负载,并在连接或重新连接时将其发送回来,与我们以前发送socketid的方式相同。

一旦服务器接收到签名的有效负载,在io.engine.generateID中,我们可以检查有效负载中的签名是否与我们使用ID和very_secret_password生成的散列相匹配。

 类似资料:
  • 我在服务器上有一个专用于套接字的Node/Express应用程序,在客户端上它是Angular 1.5。使用相同的架构(例如单独的套接字服务器)在http上本地运行代码,一切都运行得非常好。 当我在本地运行代码时,它创建了一个连接,并通过xhr进行了很少的轮询。在采用https的cloudflare上,它会进行大量轮询,不断重新连接,并且似乎不是所有消息都会到达web客户端 消息到达cloudfl

  • 问题内容: 我正在尝试使用nodejs创建类似聊天的内容。我是nodejs的新手,我想在没有socket.io的情况下创建它(我想了解它的工作原理)。这是我正在使用的代码。 而且一切正常,(我认为)。当我打开localhost:7000时,我收到有关“ CONNECTED TO:”和“ connected”以及“ I am Chack Norris”的节点CMD消息。之后,我尝试在浏览器控制台中编

  • 问题内容: 我敢肯定这是一个简单的问题,但是我不知道socket.io文档在哪里,而http://labs.learnboost.com/socket.io/上的文档并没有真正的帮助。 假设我有一个socket.io http服务器,并写了一个网站来连接它。 我如何为服务器提供保护,以使未经授权的人(未通过网站连接的人)被阻止/丢弃/禁止。 如何在服务器端结束套接字连接?所以如果我有 如何结束套接

  • Lua客户机中的on connection事件被触发并打印“connected”,但Node.js socket.io服务器中的on connection事件没有被触发。我用Python套接字服务器尝试了Lua客户机,它工作得很好!我还尝试了一个带有Javascript套接字客户端的Node.js套接字服务器,它运行得很好! NodeMCU和socket.io之间是否存在兼容性问题?

  • 我在诺德吉斯和 socket.io 更新鲜。我正在尝试使用节点js,socket.io 和快速框架中的角js制作一个聊天应用程序。我缺乏如何私下执行聊天的基本想法,到目前为止,我的代码在一组连接的用户中聊天。这是我的服务器代码 我的主套接字文件包含如下代码: 我是abe加载所有登录我的应用程序的用户。我想要的就是点击可用并开始私信,到现在聊天是公开的,服务器中连接的每个人都可以看到消息。我的ang

  • 问题内容: 可以在UNIX套接字上监听吗?我找不到与此有关的任何文档。我只看到了在专用端口上监听的可能性。 问题答案: 是。在文档中。 https://nodejs.org/api/net.html#net_server_listen_path_backlog_callback