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

问题描述 投票:0回答:2

我有一个phonegap应用程序,其中像这样连接到我的node.js套接字:

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

效果很好,但是当我转到另一个页面时,套接字断开了连接。

我可以在下一页的javascript中编写相同的代码,但这比我想的要麻烦-因为当它本来可以保持连接状态时会打开一个新的连接。

即使我切换页面,有没有办法保持与插座的连接?

javascript html5 node.js cordova socket.io
2个回答
0
投票

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


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 })
            }

因此,基本的逻辑是,通过每次套接字只连接到该特定房间并发出事件(您可以在服务器端监听,反之亦然),我们可以对多个套接字连接使用相同的会话。

© www.soinside.com 2019 - 2024. All rights reserved.