Javascript 切换页面时保持与Socket.io的连接
我有一个phonegap应用程序,其中我连接到node.js套接字,如下所示:Javascript 切换页面时保持与Socket.io的连接,javascript,html,node.js,cordova,socket.io,Javascript,Html,Node.js,Cordova,Socket.io,我有一个phonegap应用程序,其中我连接到node.js套接字,如下所示: var socket = io.connect('http://54.213.92.113:8080'); 它可以正常工作,但是当我转到另一个页面时,插座断开了连接 我可以在下一页的javascript中编写相同的代码,但这比我想象的要混乱——因为它会打开一个新的连接,而它本来可以保持连接 即使我切换页面,是否有办法保持与套接字的连接?仅当您将其构建为一个单页面应用程序时,实际页面在导航时不会重新加载。不过,最好
var socket = io.connect('http://54.213.92.113:8080');
它可以正常工作,但是当我转到另一个页面时,插座断开了连接
我可以在下一页的javascript中编写相同的代码,但这比我想象的要混乱——因为它会打开一个新的连接,而它本来可以保持连接
即使我切换页面,是否有办法保持与套接字的连接?仅当您将其构建为一个单页面应用程序时,实际页面在导航时不会重新加载。不过,最好将socket.io代码和服务器端设计为能够适应频繁的套接字连接/断开。对于编写在手机上运行的代码来说尤其如此。仅当您将其构建为一个单页应用程序时,实际页面在导航时不会重新加载。不过,最好将socket.io代码和服务器端设计为能够适应频繁的套接字连接/断开。这对于编写在手机上运行的代码来说尤其如此。假设您有一个多页应用程序,在这里您可以做一个技巧,当您的套接字在页面加载时第一次连接时,您可以将会话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 })
})
}
});
现在,您已经将套接字连接绑定到会话,现在您也在客户端发送确认信息
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 })
}
客户端代码
socket.on("set-session-acknowledgement", function(data) {
sessionStorage.setItem('sessionId', data.sessionId);
})
这将在浏览器会话存储中存储会话id。现在,当页面从第1页导航到第2页时,依此类推。然后将该会话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 })
}
因此,基本上,背后的逻辑是,我们可以通过这样做,将同一个会话用于多个套接字连接,因为每次套接字将仅连接到特定的房间,并发出事件,您可以在服务器端侦听,反之亦然。假设您有一个多页应用程序,在这里,您可以做一个技巧,当您的套接字在页面加载时第一次连接时,您可以像这样将会话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 })
})
}
});
现在,您已经将套接字连接绑定到会话,现在您也在客户端发送确认信息
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 })
}
客户端代码
socket.on("set-session-acknowledgement", function(data) {
sessionStorage.setItem('sessionId', data.sessionId);
})
这将在浏览器会话存储中存储会话id。现在,当页面从第1页导航到第2页时,依此类推。然后将该会话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 })
}
因此,基本上,背后的逻辑是,我们可以通过这样做将同一会话用于多个套接字连接,因为每次套接字将仅连接到该特定房间,并发出事件,您可以在服务器端收听,反之亦然。服务工作者。服务工作者。谢谢您的建议!快速提问…当我的应用程序切换页面时,它是否会以相同的客户端(具有相同的id)连接到套接字?如果是这样的话,我可以在服务器上设置一个计时器,在几秒钟内查找断开连接的客户端。您可能会在每个页面上获得不同的套接字id。你不应该将套接字id等同于用户,你应该使用更持久的东西,比如cookie。然后,当一个新的套接字连接进入时,您可以检查cookie以查看该连接属于哪个用户。有关如何使用express sessions处理此问题,请参见以下答案:谢谢您的建议!快速提问…当我的应用程序切换页面时,它是否会以相同的客户端(具有相同的id)连接到套接字?如果是这样的话,我可以在服务器上设置一个计时器,在几秒钟内查找断开连接的客户端。您可能会在每个页面上获得不同的套接字id。你不应该将套接字id等同于用户,你应该使用更持久的东西,比如cookie。然后,当一个新的套接字连接进入时,您可以检查cookie以查看该连接属于哪个用户。有关如何使用express sessions处理此问题,请参见此答案:此问题是很久以前提出的,您对该问题的解决方案是优雅而准确的。我将在实现中使用此解决方案的一种形式。我的网站实际上使用的是PHP后端,所以它已经有了会话ID,所以我将绑定它,而不是生成它,但我有一些想法,可以通过为我正在开发的其他应用程序生成它来提高安全性。谢谢。这个问题很久以前就被问过了,你对这个问题的解答很优雅,很到位。我将在实现中使用此解决方案的一种形式。我的网站实际上使用的是PHP后端,所以它已经有了会话ID,所以我将绑定它,而不是生成它,但我有一些想法,可以通过为我正在开发的其他应用程序生成它来提高安全性。谢谢