刷新后如何将数据发送到用户套接字 ID - socket.io

Lor*_*rza 1 javascript sockets socket.io

举个例子,假设用户将一些 json 发送到包含他的套接字 id 的服务器,服务器需要 5 秒来响应。当它准备好响应时,它从 json 对象中提取 socket.id,并只向该套接字发出一些数据。

如果用户在发送消息和服务器响应之间刷新(因此更改他正在连接的套接字),我将如何确保他们仍然接收数据?

服务器:

io.on("connection", function(socket) {
  socket.on("data", function(data) {
    var id = data.socket_id; 
    
    io.sockets.connected[id].emit("response", "sup"); 

    // I know I could just do -> socket.emit("response", "sup") <- but im simply trying it out for      learning purposes
  })
})
Run Code Online (Sandbox Code Playgroud)

客户:

socket.emit("data", {
  username: "chris", 
  socket_id: socket.id, 
});

socket.on("response", function(res) {
  console.log(res); 
})
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 5

如果用户刷新他们的页面,这将建立一个新的 socket.io 连接,该连接将有一个新的和不同的socket.id. 因此,如果您希望能够跨刷新识别特定的浏览器会话,那么您需要一个在页面刷新后仍然存在的标识符。那不是socket.id.

最有可能的是,您会在 cookie 中使用某种持久的用户 ID。如果您还没有进行任何类型的身份验证,在 cookie 中为您提供用户 ID,那么您可以简单地在 cookie 中创建一个唯一 ID,如果用户向您的服务器发出请求时还没有唯一 ID。这将为每个传入的 socket.io 连接在 cookie 中提供一个唯一的用户 ID(只要 cookie 没有被禁用)。当您的 socket.io 连接连接时,您可以将其添加到Map您保留的对象中,其中 userID 是键,当前socket.id是数据,您可以将 userID 添加为套接字上的属性。当套接字断开连接时,您可以将其从Map对象中移除。

然后,当您想要保存对用户的引用时,您保存的是 userID,而不是socket.id并且该引用在页面刷新时保持不变。当您想要发送到用户 ID 时,您可以在Map对象中查找它以获取当前socket.id(如上所述,连接和断开连接事件处理程序将自动保持最新),然后使用它发送给它。