Подтвердить что ты не робот

Как я могу перехватить соединение с WebSocket?

В 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 script?

Любой вход будет полезен.

Спасибо!

4b9b3361

Ответ 1

Вы можете присоединить обработчик к событию socket.onclose. Он будет вызываться, когда вы нажмете ESC, и соединение будет прервано.

Смотрите: http://jsfiddle.net/w5aAK/1/

Одной из проблем, которую вы не можете получить в данный момент, является прерванная ошибка, выводимая на консоль. На данный момент я не могу понять, что я боюсь.

Ответ 2

Вы не можете его поймать, и это не ваша вина. Это ошибка FireFox. Голосуйте за него здесь:

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

Я лично пробовал всевозможные решения:

обработчики событий onunload onbeforeunload onclose try..catch some js обработка ошибок сторонние службы и т.д.

Вы можете войти в консоль своего сокета, он закрыт перед выгрузкой, но FF думает иначе..: (

Решение (не отвечать непосредственно на ответ, но оно работает):

Это ошибка, поэтому вы не можете ее поймать, но эта информация не является решением. После всех сумасшедших обходных решений и попыток поймать эту ошибку, я наконец нашел эту работу. Если вы используете socket.io для работы с WebScokets, он может работать с различными транспортными технологиями. xhr-опрос работает с 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 для более старого браузера

Определить типы транспорта на стороне клиента

socket.io не работает с транспортом: ['xhr-polling']