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 / Google chrome 的 Socket.io 客户端插件
在 Firefox 中运行 node.js 和 socket.io 时出现 CORS 错误