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

时间:2018-03-17 16:05:40

标签: 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
  })
})
&#13;
&#13;
&#13;

客户:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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