我有一个phonegap应用程序,其中像这样连接到我的node.js套接字:
var socket = io.connect('http://54.213.92.113:8080');
效果很好,但是当我转到另一个页面时,套接字断开了连接。
我可以在下一页的javascript中编写相同的代码,但这比我想的要麻烦-因为当它本来可以保持连接状态时会打开一个新的连接。
即使我切换页面,有没有办法保持与插座的连接?
仅当您将其构建为单页应用程序时,在浏览时实际页面不会重新加载。但是,最好将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 })
})
}
});
现在您已经将套接字连接绑定到会话,现在您也在客户端也发送确认。您可以执行的操作是将会话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 }) }
因此,基本的逻辑是,通过每次套接字只连接到该特定房间并发出事件(您可以在服务器端监听,反之亦然),我们可以对多个套接字连接使用相同的会话。