繁体   English   中英

如何捕获WebSocket连接中断?

[英]How do I catch a WebSocket connection interruption?

在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脚本范围之外运行而不可能?

任何输入都会有所帮助。

谢谢!

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

请参阅: http//jsfiddle.net/w5aAK/1/

您目前无法解决的一个问题是输出到控制台的中断错误。 在我害怕的那一刻,没有办法捕获它。

你无法抓住它,这不是你的错。 这是FireFox的错误。 在这里投票:

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

我亲自尝试过各种解决方案:

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

你可以登录控制台你的插座,它在卸载前关闭,但FF认为不同.. :(

解决方案(没有直接回答答案,但它的工作原理):

这是一个错误,所以你无法捕获,但这个信息不是解决方案 经过各种疯狂的解决方法,并试图捕捉到这个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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM