举一个例子,让我们说用户将一些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;
客户:
socket.emit("data", {
username: "chris",
socket_id: socket.id,
});
socket.on("response", function(res) {
console.log(res);
})
&#13;
答案 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事件处理程序自动保持最新状态)和然后用它发送给它。