2012-11-29 19 views
11

Wenn Sie in Firefox (mindestens) ESC drücken, werden alle geöffneten WebSockets-Verbindungen geschlossen. Ich muss diese Trennung erfassen und versuchen, wieder zu verbinden, sobald es wieder verfügbar ist.Wie erhalte ich eine WebSocket-Verbindungsunterbrechung?

Hier ist ein Beispiel für den Code, den ich versucht habe zu implementieren, aber nichts, was ich herausfinden kann, fängt den Fehler und erlaubt mir, es elegant zu behandeln.

Werfen Sie einen Blick auf den Code: 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); 

Schalten Sie Ihre Konsole und die Ausgabe sehen.

Mache ich hier etwas falsch, oder ist es einfach nicht möglich, weil die Verbindung außerhalb des Bereichs des JS-Skripts ausgeführt wird?

Jede Eingabe wäre hilfreich.

Danke!

+1

Sie rufen sollte 'socket.send()' innerhalb der 'onopen' Rückruf , weil nach 1 Sekunde noch keine Verbindung hergestellt werden kann. – neevek

+1

Ich bin mir dessen bewusst und weiß, wie ich damit umgehen soll, aber das ist nicht die Frage, die ich stelle. – Zach

+0

Die ESC-Taste Problem scheint in Firefox behoben 27 – Tieme

Antwort

5

Sie können einen Handler an das Ereignis socket.onclose anhängen. Es wird aufgerufen, wenn Sie ESC drücken und die Verbindung unterbrochen wird.

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

Ein Problem, das Sie nicht herum im Moment bekommen kann, ist der unterbrochene Fehler auf der Konsole ausgegeben werden. Es gibt keine Möglichkeit, das im Moment zu erfassen, fürchte ich.

+1

Ja, das ist, wovor ich Angst hatte, ich musste es nur überprüfen. Ich habe bereits ein 'close'-Event, um damit umzugehen, aber ich hatte gehofft, die Ausnahme ungültig zu machen. Danke für deinen Beitrag! – Zach

+3

_Ein Problem, mit dem Sie im Moment nicht umgehen können, ist der unterbrochene Fehler, der an die Konsole ausgegeben wird. Gibt es einen Hinweis darauf in irgendwelchen Spezifikationen oder Dokumenten? –

1

Sie können es nicht fangen und es ist nicht Ihre Schuld. Es ist Firefox-Fehler. Stimmen Sie für die es hier:

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

ich persönlich versucht alle Arten von Lösungen:

Event-Handler onunload onbeforeunload OnClose try..catch einige js Fehler 3rd-Party-Dienste usw. Handhabung

Sie können anmelden, um Ihren Socket zu trösten, es ist vor dem Entladen geschlossen, aber FF denkt anders .. :(

Lösung (Nicht direkt an beantworten die Antwort, aber es funktioniert):

es ein Fehler ist, so dass Sie nicht fangen können, aber diese Info ist nicht Lösung. Nach all den verrückten Workarounds und dem Versuch, diesen Fehler zu finden, habe ich das endlich gefunden. Wenn Sie socket.io für die Arbeit mit WebScokets verwenden, kann es mit verschiedenen Transporttechnologien arbeiten. xhr-polling funktioniert mit 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 + '/'); 
} 

Was mir geholfen - vielleicht auch Ihnen helfen:

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' ]

Verwandte Themen