gpt4 book ai didi

node.js - 在重新连接、socket.io、node.js 上重用套接字 ID

转载 作者:搜寻专家 更新时间:2023-11-01 00:02:37 24 4
gpt4 key购买 nike

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

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

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

最佳答案

有可能

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

您只需要覆盖 io.engine.generateId。无论该方法返回什么,都将是分配给套接字的 id。这是 docs about generateId

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

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

例子

作为示例,我将展示如何重用从客户端发送的 ID,或者在客户端未发送时创建一个新 ID。该 ID 将在握手请求中作为查询参数 socketId 发送。

1。覆盖 io.engine.generateId

首先你需要覆盖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 生成一个新的。特别使用该库的原因是因为那是原始方法的作用。在这里你可以找到 source code

2。发送连接请求信息

一旦你有了它,你需要从客户端发送 socketId 参数。这在 the docs 中有描述。

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

process.env.WEBSOCKET_URL 将是您的网络套接字正在监听的 URL。

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

3。发送重连请求信息

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

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

就像那样,只要它是从客户端发送的,您就会重复使用相同的套接字 ID。

安全问题

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

使用上面的相同示例,我们将向客户端发送类似这样的内容,可能是 .on('connect'):

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

客户端将存储该有效负载并在连接或重新连接时将其发回,就像我们之前发送 socketId 一样。

一旦服务器收到签名的有效载荷,在 io.engine.generateId 中,我们可以检查有效载荷中的签名是否与我们使用 ID 和 VERY_SECRET_PASSWORD.

关于node.js - 在重新连接、socket.io、node.js 上重用套接字 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294620/

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