即使用户转到网站内的不同页面,socket.io 连接是不是仍然存在?

Posted

技术标签:

【中文标题】即使用户转到网站内的不同页面,socket.io 连接是不是仍然存在?【英文标题】:Does a socket.io connection stay even when a user goes to a different page within the website?即使用户转到网站内的不同页面,socket.io 连接是否仍然存在? 【发布时间】:2018-06-22 16:04:46 【问题描述】:

我正在使用 javascript、Node.js 和 socket.io 制作一个 webapp。在 Web 应用程序的一部分(大厅)中,用户可以按下一个按钮来开始游戏,具体操作如下:

$.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 文件)来响应该请求。用户还可以从游戏页面导航回大厅,这以类似的方式发生。大厅和 gameStart 页面的 Javascript 文件都有一部分用于与以下内容建立套接字连接:

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");
  `)`;

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

【问题讨论】:

通常除非手动关闭套接字,或者用户完全关闭该站点的浏览器/选项卡,否则仍将保持打开状态,尽管有时您应该检查您如何对其进行编码以使其工作。您可以编写代码以在游戏开始时关闭套接字并根据需要打开另一个套接字 但是文件只有在调用document.open时才被“清空”,并不代表后台的js就停止了。而且您绝对不应该一直重写页面。将其设计为隐藏某些部分的单个页面。 【参考方案1】:

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

您可以在服务器端handle client disconnection event。

【讨论】:

【参考方案2】:

通常情况下,除非手动关闭套接字,或者用户完全关闭该站点的浏览器/选项卡,否则仍将保持打开状态,尽管有时您应该检查您如何对其进行编码以使其工作。您可以编写代码以在游戏开始时关闭套接字并根据需要打开另一个。

基本概念是浏览器和站点服务器之间的某种握手,允许数据流,打包任何可能的数据。因此,开始可能在同一页面上开始的同一站点的游戏,套接字仍将打开,想象一下您在您的个人资料中的 facebook,并且您打开了一个群组页面,这会阻止您的聊天进入吗?不,所以我希望我的见解会有所帮助

【讨论】:

以上是关于即使用户转到网站内的不同页面,socket.io 连接是不是仍然存在?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以读取使用 socket.io 发送的对象,即使它没有为前端的用户打印出来

如何使socket.io只连接一次

对象内的 Socket.io 客户端

使用 Socket.IO 开发聊天室

在已经在wampserver上运行的网站上运行socket.io聊天应用程序

即使我在服务器上允许它,Socket.io 也会出现 CORS 错误