【问题标题】:How do I catch a WebSocket connection interruption?如何捕获 WebSocket 连接中断?
【发布时间】:2012-11-17 00:08:24
【问题描述】:

在 Firefox 中(至少),如果您按 ESC,那么它将关闭所有打开的 WebSockets 连接。 我需要捕获该断开连接并在它再次可用时尝试重新连接。

这是我尝试实现的代码示例,但我想不出的任何东西都无法捕捉到错误并允许我优雅地处理它。

看代码: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 脚本的范围而无法运行?

任何意见都会有所帮助。

谢谢!

【问题讨论】:

  • 你应该在onopen回调中调用socket.send(),因为1秒后可能仍然无法建立连接。
  • 我知道并知道如何处理它,但这不是我要问的问题。
  • ESC 按钮问题似乎已在 firefox 27 中修复

标签: javascript websocket


【解决方案1】:

您可以将处理程序附加到socket.onclose 事件。当您按下 ESC 并中断连接时将调用它。

见:http://jsfiddle.net/w5aAK/1/

目前您无法解决的一个问题是输出到控制台的中断错误。恐怕目前无法捕捉到这一点。

【讨论】:

  • 是的,这就是我害怕的,我只需要验证它。我已经有一个onclose 事件来处理它,但希望使异常无效。感谢您的意见!
  • 您目前无法解决的一个问题是输出到控制台的中断错误。在任何规范或文档中是否对此有参考?
【解决方案2】:

你抓不住它,这不是你的错。这是火狐的错误。在这里投票:

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

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

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

您可以登录到控制台控制台,它在卸载前已关闭,但 FF 认为不同.. :(

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

这是一个错误,因此您无法捕捉到,但此信息不是解决方案。经过各种疯狂的变通方法并试图捕捉该错误后,我终于找到了这个工作。如果您使用 socket.io 与 WebScotets 一起工作,它可以与不同的传输技术一起工作。 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 + '/');
}

什么帮助了我 - 也可能帮助你:

Web Socket support in Node.js/Socket.io for older browser

Define transport types on the client side

socket.io doens't work with transports: [ 'xhr-polling' ]

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多