我正在尝试使用socket.io创建聊天,遇到问题。
我想知道是否有可能在项目的不同页面中重用我的socket.id而不丢失我的套接字的连接吗?
谢谢
答案 0 :(得分:0)
给定的socket.io连接仅属于一个特定页面。当用户浏览到新页面时(假设您没有使用单页面应用(SPA)架构将新内容动态加载到同一母版页面中),则该socket.io连接将关闭,然后可以打开新页面一个新的socket.io连接(将具有另一个socket.id)。
我想知道是否有可能在项目的不同页面中重用我的socket.id而不丢失我的套接字的连接吗?
否,不是当浏览器实际上正在将一个新页面加载到当前窗口/选项卡中时。
创建某种ID的常用方法是在一个页面进入下一个页面时将其持久化,即将一个ID放入cookie中,然后该cookie将在用户浏览到的每个新页面上可用并保持不变从一页到下一页保持一致。
如果在服务器上使用Express,则可以使用express-session为每个新用户自动创建一个持久会话,甚至可以将数据存储在该会话对象中,该对象将在用户请求的每个页面上可用。 / p>
答案 1 :(得分:0)
页面刷新和导航时,您的套接字将断开连接,因此您可以使用此技巧。它在我的情况下有效
假设您有一个多页应用程序,那么您可以在这里做一个技巧,当您的套接字在页面加载时首次连接时,您可以像这样将会话ID分配给该特定连接,然后绑定该连接。参加该会议。
io.on('connection', function(socket) {
socket.on('start-session', function(data) {
console.log("============start-session event================")
console.log(data)
if (data.sessionId == null) {
var session_id = uuidv4(); //generating the sessions_id and then binding that socket to that sessions
socket.room = session_id;
socket.join(socket.room, function(res) {
console.log("joined successfully ")
socket.emit("set-session-acknowledgement", { sessionId: session_id })
} else {
socket.room = data.sessionId; //this time using the same session
socket.join(socket.room, function(res) {
console.log("joined successfully ")
socket.emit("set-session-acknowledgement", { sessionId: data.sessionId })
})
}
});
现在您已经将套接字连接绑定到会话,现在您也在客户端发送确认。您可以做的就是将会话ID像这样存储到Web浏览器会话存储中
在客户端代码
socket.on("set-session-acknowledgement", function(data) {
sessionStorage.setItem('sessionId', data.sessionId);
})
这会将会话ID存储在浏览器的会话存储中。现在,当页面从page1导航到page2时,依此类推。然后将该会话ID发送到服务器,这样您将在逻辑上连接到同一会话
var session_id;
// Get saved data from sessionStorage
let data = sessionStorage.getItem('sessionId');
console.log(data)
if (data == null) {
session_id = null//when we connect first time
socket.emit('start-session', { sessionId: session_id })
} else {
session_id = data//when we connect n times
socket.emit('start-session', { sessionId: session_id })
}
因此,基本的逻辑是我们可以通过将相同的会话用于多个套接字连接,因为每次套接字仅连接到该特定房间并发出事件时,您可以在服务器端监听,反之亦然