Firefox for Socket.io 上的“页面加载时 websocket 被中断”

Posted

技术标签:

【中文标题】Firefox for Socket.io 上的“页面加载时 websocket 被中断”【英文标题】:"websocket was interrupted while page is loading" on Firefox for Socket.io 【发布时间】:2012-12-17 21:41:59 【问题描述】:
Error: The connection to <websocket> was interrupted while the page was loading.
Source File: localhost/socket.io/node_modules/socket.io-client/dist/socket.io.js
Line: 2371

我是 socket.io 的新手,我试图搜索这个,但我没有得到答案。

当我在 Firefox 上刷新页面时,Websocket 被中断。这就是服务器端等待授权客户端的原因。

代码如下: server.js

var app = require('http').createServer(handler),
  io = require('socket.io').listen(app),
  fs = require('fs')

app.listen(8080);

function handler(req, res) 
  fs.readFile(__dirname + '/index.html',
    function (err, data) 
      if (err) 
        res.writeHead(500);
        return res.end('Error loading index.html');
      
      res.writeHead(200);
      res.end(data);
    );


io.sockets.on('connection', function (socket) 
  socket.emit('news', 
    hello: 'world'
  );
  socket.on('my other event', function (data) 
    //alert(JSON.stringify(data));  
    console.log(data);
  );

);

index.html

<script src="node_modules/socket.io-client/dist/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8080');

  socket.on('news', function (data) 
    alert(JSON.stringify(data));
    console.log(data);
    socket.emit('my next event',  my: 'data' );
  );

</script>

【问题讨论】:

您需要包含导致此问题的代码。否则没有意义。 ethrbunny 我已添加代码检查它请...帮帮我... 面临几乎类似的问题。请帮忙。 ***.com/questions/16880454/… 【参考方案1】:

这对您的应用程序有什么影响?我的猜测是,在控制台中看到错误并不是很好。

这里的问题是您看到 Firefox 登录此错误并且您无能为力。无法使用 try...catch 块或通过 websocket.onerror/websocket.onclose 捕获此错误。

见:How do I catch a WebSocket connection interruption?

相关:

Should WebSocket.onclose be triggered by user navigation or refresh? Firefox - Race condition allows ghost WebSocket connections to live after tab closed

【讨论】:

leggetter-->在服务器端客户端未获得授权,这就是客户端不发出任何数据的原因。但在 Internet Explorer 9 中,它获得了授权并发出数据,即使用 xhr-polling。 根据您的问题,听起来您在问为什么会收到中断错误。如果这不是您要问的,请更新您的问题。【参考方案2】:

这是因为,您没有关闭打开的 websocket。

此代码将消除此错误:

$(window).on('beforeunload', function()
    socket.close();
);

【讨论】:

我在Chrome 也遇到过这种情况。这似乎已经解决了。 实际上,我认为这并没有解决问题。我也试过this,但我也没有修复它。 这并没有解决我的问题。 Firefox bug 是问题所在,像这样的解决方法不适用于我的 Firefox (41) 版本。升级做到了;但不幸的是,如果您正在编写一个 web 应用程序(我猜这就是我们大多数人对 socket.io 感兴趣的原因),您无法决定您的用户使用哪个版本的 Firefox(或其他浏览器)。 :( 没有为我修复,直到我发现服务器没有响应 WebSocket close 消息。现在服务器很好地确认关闭并且 Firefox (60.0) 很高兴。 我在 2020 年仍然有这个问题,但仅限于 wss://【参考方案3】:

我刚刚浏览了 Socket.IO 教程,我遇到了这个确切的问题。我尝试了发布的解决方案,但它们似乎根本不起作用。

经过一些摆弄、一些尖叫和一些橡皮鸭,我终于弄清楚了问题所在。问题是它在正确初始化套接字变量之前尝试连接到套接字。 javascript 嘘嘘 #1。

如果你将修改你的文件以包含 jQuery,然后像这样包装你的函数:

    <script src="/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
	<script>
    $(function()
      var socket = io.connect('http://localhost:8080');

      socket.on('news', function (data) 
        alert(JSON.stringify(data));
        console.log(data);
        socket.emit('my next event',  my: 'data' );
      );	
    );
    </script>

你会取得更大的成功。

【讨论】:

这对我没有任何帮助。相同的错误消息仍然会记录在控制台中。【参考方案4】:

这似乎是 Firefox 中的一个开放错误(截至 2015-03-29):

https://bugzilla.mozilla.org/show_bug.cgi?id=712329

正如 Alexander 指出的那样,解决方法(目前)是在 beforeunload 上调用 websocket 上的 close()。

2016-04 更新:根据 Bugzilla 的说法,这将在 Firefox 48 中修复

【讨论】:

此解决方法不适用于 socket.io(使用最新版本 1.3.5) @LukasLiesis 我认为这与套接字服务器无关。我正在使用 php WebSockets 服务器 @Victor socket.io 用于双方 - 服务器和 客户端 @LukasLiesis 但这仍然与 socket.io 产品本身无关 升级 Firefox 是唯一对我有用的方法。谢谢。 “解决方法”在 Firefox 41 上对我不起作用。【参考方案5】:

一种解决方案是对断开连接事件设置超时。

         setTimeout(() => 
            $('#offlineModal').modal('show')
          , 5000)

【讨论】:

【参考方案6】:

多年来,我们的基于 Undertow 的自定义网络服务器一直存在这个问题——我的问题是我的服务器没有响应套接字关闭消息。

根据Jan Wielemaker 的评论,我检查了AbstractReceiveListener.onFullCloseMessage 的套接字关闭处理程序代码,并意识到我没有调用超级方法。添加super.close() 后,客户端上的套接字干净地关闭并且没有发出错误。

【讨论】:

以上是关于Firefox for Socket.io 上的“页面加载时 websocket 被中断”的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 插件中的 Socket.io

Firefox / Google chrome 的 Socket.io 客户端插件

在 Firefox 中运行 node.js 和 socket.io 时出现 CORS 错误

Socket.io 无法在 Chrome 和 Firefox 上向 Node 服务器发送消息

socket io客户端和服务器之间的连接问题

Heroku 上的 socket.io + node.js