如何捕获WebSocket连接中断?

11
在Firefox中(至少),如果按下ESC,则会关闭所有打开的WebSocket连接。我需要捕获该断开连接并在其再次可用时尝试重新连接。
这是我尝试实现的代码示例,但我无法找出任何能够捕获错误并允许我优雅地处理它的方法。
请查看代码:http://jsfiddle.net/w5aAK/
var url = "ws://echo.websocket.org";
    try {
        socket = window['MozWebSocket'] ? new MozWebSocket(url) : new WebSocket(url);
        socket.onopen = function(){
            console.log('Socket is now open.');
        };
        socket.onerror = function (error) {
            console.error('There was an un-identified Web Socket error');
        };
        socket.onmessage = function (message) {
            console.info("Message: %o", message.data);
        };
    } catch (e) {
        console.error('Sorry, the web socket at "%s" is un-available', url);
    }

setTimeout(function(){
    socket.send("Hello World");
}, 1000);

打开你的控制台并观察输出。

我在这里做错了什么,还是因为连接运行在JS脚本的范围之外所以不可能?

任何输入都会有帮助。

谢谢!


1
你应该在 onopen 回调函数中调用 socket.send(),因为连接可能在 1 秒后仍未建立。 - neevek
1
我知道那个并且知道如何处理它,但那不是我正在问的问题。 - Zach
在 Firefox 27 中,ESC 按钮问题似乎已经得到解决。 - Tieme
2个回答

5
您可以将处理程序附加到socket.onclose事件。当您按下ESC并且连接中断时,它将被调用。
请参见:http://jsfiddle.net/w5aAK/1/ 目前无法解决的一个问题是输出到控制台的中断错误。恐怕目前没有捕获它的方法。

1
是的,这正是我担心的,我只是需要验证一下。我已经有一个onclose事件来处理它,但是希望避免异常。感谢您的建议! - Zach
6
目前无法避免的一个问题是控制台输出了“interrupted error”。有没有任何规范或文档与此相关? - Max Ch

1

您无法捕获它,而且这不是您的错。这是Firefox的错误。在此处为其投票:

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

我个人尝试了各种解决方案:

事件处理程序 onunload onbeforeunload onclose try..catch 一些 js 错误处理第三方服务等。

您可以将套接字记录到控制台,它会在卸载之前关闭,但 Firefox 认为不同 :(

解决方案(不是直接回答问题的答案,但它有效):

这是一个 bug,所以你不能捕获,但这个信息不是 解决方案。在各种疯狂的变通和尝试捕捉这个 bug 后,我终于发现了这个可行的方法。如果您使用 socket.io 来处理 WebScokets,它可以使用不同的传输技术。xhr-polling 可以与 Firefox 兼容。

if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) { //test for Firefox/x.x     or Firefox x.x (ignoring remaining digits);
    socket = io.connect('//' + node_server + '/', {
        transports: ['polling']
    });
} else {
    socket = io.connect('//' + node_server + '/');
}

以下内容可能会对您有所帮助:

在Node.js/Socket.io中为旧浏览器提供Web Socket支持

在客户端定义传输类型

socket.io不支持传输:['xhr-polling']


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接