【问题标题】:Stay Connected to Socket.io while switching pages在切换页面时保持与 Socket.io 的连接
【发布时间】:2013-08-14 19:24:44
【问题描述】:

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

var socket  = io.connect('http://54.213.92.113:8080');

它工作正常,但是当我转到不同的页面时,套接字会断开连接。

我可以在下一页的 javascript 中编写相同的代码,但这比我想象的要复杂 - 因为它会打开一个新的连接,而它本来可以保持连接。

即使我切换页面,有什么方法可以保持与套接字的连接?

【问题讨论】:

标签: javascript html node.js cordova socket.io


【解决方案1】:

假设你有一个多页面应用程序,你可以在这里做一个技巧,当你的套接字在页面加载时第一次连接时,你可以像这样将会话 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 })
            }

所以基本上背后的逻辑是,我们可以通过这样做为多个套接字连接使用相同的会话,因为每次套接字将仅加入到该特定房间并发出您可以在服务器端监听的事件,反之亦然.

【讨论】:

  • 这个问题很久以前就被问过了,你对这个问题的解决方案很优雅而且很到位。我将在我的实现中使用这种解决方案的一种形式。我的网站实际上使用的是 PHP 后端,因此它已经有一个会话 ID,所以我将绑定它而不是生成它,但我有关于如何通过为我正在处理的其他应用程序生成它来提高安全性的想法。谢谢。
【解决方案2】:

仅当您将其构建为单页应用程序时,实际页面在导航时不会重新加载。但是,最好将您的 socket.io 代码和服务器端设计为能够适应频繁的套接字连接/断开连接。对于为在手机上运行而编写的代码尤其如此。

【讨论】:

  • 感谢您的建议!快速提问...当我的应用程序切换页面时,它会以相同的客户端(具有相同的 id)连接到套接字吗?如果是这样,我可以在服务器上放置一个计时器,它会在几秒钟内寻找断开连接的客户端。
  • 您可能会在每个页面中获得不同的套接字 ID。您不应该将套接字 id 等同于用户,您应该使用更持久的东西,例如 cookie。然后当一个新的socket连接进来时,你可以查看cookie来查看该连接属于哪个用户。请参阅此答案以了解如何使用快速会话来处理它:stackoverflow.com/questions/12166187/…
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 2020-12-18
  • 2020-12-20
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多