Javascript 切换页面时保持与Socket.io的连接

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中编写相同的代码,但这比我想象的要混乱——因为它会打开一个新的连接,而它本来可以保持连接 即使我切换页面,是否有办法保持与套接字的连接?仅当您将其构建为一个单页面应用程序时,实际页面在导航时不会重新加载。不过,最好

我有一个phonegap应用程序,其中我连接到node.js套接字,如下所示:

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,所以我将绑定它,而不是生成它,但我有一些想法,可以通过为我正在开发的其他应用程序生成它来提高安全性。谢谢