【问题标题】:How to send data to a users socket id after they have refreshed - socket.io刷新后如何将数据发送到用户套接字 id - socket.io
【发布时间】:2018-03-17 16:05:39
【问题描述】:

举个例子,假设用户向服务器发送了一些包含他的套接字 id 的 json,服务器需要 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
  })
})

客户:

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

socket.on("response", function(res) {
  console.log(res); 
})

【问题讨论】:

    标签: javascript sockets socket.io


    【解决方案1】:

    如果用户刷新他们的页面,这将建立一个新的 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 对象中删除。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-03
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2014-10-12
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多