是否可以重用socket.id或多次使用它?
假设一个用户在不同的浏览器选项卡中查看同一站点的多个页面。我想使用一个socket.id,socket来处理它们。
如果用户收到通知,它应该在所有选项卡上弹出一个单一的socket.emit。
从以前的响应日期来看,我认为在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