Как я могу перехватить соединение с 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?
Любой вход будет полезен.
Спасибо!
Ответы
Ответ 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']