0

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

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

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

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

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

4

2 回答 2

3

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

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

于 2019-10-24T07:27:49.930 回答
0

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

于 2013-08-14T19:30:21.547 回答