即使用户访问网站中的其他页面,socket.io连接是否仍然存在?

时间:2018-01-13 10:34:41

标签: javascript node.js web-applications socket.io

我正在使用Javascript,Node.js和socket.io制作一个webapp。在网络应用程序(大厅)的一个部分,用户可以按一个按钮开始游戏,这样做:

$.ajax({
  url: "gameStart",
  type: 'POST',
  data: {myName: myNickname,
    enemyName: accepter,
    roomNamer: "1",
    showValid: offerValidStr,
    showThreat: offerThreatStr},
  success: function(page) {
    document.open();
    document.write(page);
  }
});

服务器通过呈现HTML页面并发送它(以及相关的CSS和Javascript文件)来响应该请求。用户还可以从游戏页面导航回大厅,这以类似的方式发生。大厅的Javascript文件和gameStart页面都有一个与它们建立套接字连接的部分:

var socket = io();

在两个Javascript文件中,如果用户断开连接而没有离开页面(可能是因为服务器问题),我有:

 socket.on('disconnect', function() {
    prettyAlert("Connection Lost", "The connection has been lost. "
        + " Sorry about that! You should return to the <a href='https://toroidal-chess.herokuapp.com/'>login page</a>. "
        + "This could just be bad luck. However, if it keeps happening, "
        + " it is probably a bug.", [OK_BUTTON], true, "disconnect");
  `})`;

我的印象是,当用户在大厅和gameStart页面之间导航时,他们打开的任何套接字都会断开连接,从而创建一个新的套接字。但是,当我通过运行节点服务器并使用浏览器连接到本地测试本地时,当我终止服务器时,会弹出多个警报消息。实际上,每次去大厅和gameStart页面时都会弹出一个弹出窗口。所以我猜这意味着所有旧插座仍然存在?但是我认为一旦用户转到不同的页面,一个页面的Javascript就会停止运行。有人可以解释发生了什么吗?

2 个答案:

答案 0 :(得分:1)

除非您正在执行SPA,否则当用户刷新页面时,无法避免socket.io断开连接。

但是,您可以handle page regresh disconnection添加超时检查。

答案 1 :(得分:1)

通常情况下,除非手动关闭套接字,或者用户完全关闭该网站的浏览器/标签,否则仍会保持打开状态,但有时您应检查编码方式是否有效。您可以对其进行编码以在游戏开始时关闭套接字,并根据需要打开另一个套接字。

基本概念在浏览器和站点服务器之间存在某种握手,允许数据流,数据包可能是什么。所以开始一个可能在同一页面上开始的同一网站的游戏,套接字仍然是开放的,想象你的个人资料上的Facebook你打开一个组页面会阻止你的聊天进来吗?不,所以我希望这些见解很有帮助