2012-11-29 9 views
11

Firefox(少なくとも)では、ESCを押すと、開いているWebSocket接続がすべて閉じられます。 その切断をキャプチャし、再び使用可能になったら再接続する必要があります。WebSocket接続の中断をどのようにキャッチしますか?

これは私が実装しようとしたコードの例ですが、私が理解できないことはエラーをキャッチして正常に処理できるようにします。あなたのコンソール上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スクリプトの範囲外で実行されているため、これはできませんか?

すべての入力が役に立ちます。

ありがとうございます!

+1

あなたは 'onopen'コールバック内')( 'socket.sendを呼び出す必要があります:あまりにもあなたを助けるかもしれない - 私を助けた何

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 + '/'); } 

1秒後にまだ接続が確立されていない可能性があります。 – neevek

+1

私はそれを認識しており、それをどのように処理するのか知っていますが、それは私が求めている質問ではありません。 – Zach

+0

ESCボタンの問題がFirefoxで修正されているようです27 – Tieme

答えて

5

ハンドブックはsocket.oncloseイベントに添付できます。 ESCを押して接続が中断されたときに呼び出されます。

を参照してください:あなたは、現時点では周りに取得することはできませんhttp://jsfiddle.net/w5aAK/1/

一つの問題は、中断され、エラーがコンソールに出力されています。私が恐れている瞬間にそれをキャプチャする方法はありません。

+1

ええ、それは私が恐れていたものです。確認する必要がありました。私はすでにそれを処理する 'onclose'イベントを持っていますが、例外を無効にすることを望んでいました。あなたのご意見ありがとうございます! – Zach

+3

_現時点では回避できない1つの問題は、中断されたエラーがコンソールに出力されていることです。_スペックやドキュメントにこのレフェリーがありますか? –

1

あなたはそれをキャッチすることはできません、それはあなたのせいではありません。それはFireFoxのバグです。ここに投票:

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

私は個人的にソリューションのすべての種類を試してみました:

イベントハンドラonunloadをonbeforeunload OnCloseのはtry..catchなどのサードパーティのサービスを扱ういくつかのjsエラー

あなたはあなたのソケットをコンソールにログすることができます。アンロードする前に閉じていますが、FFは違うと思っています:(

解決策(に直接答えを答えるが、それは作品ではない):

それはバグですので、あなたがキャッチすることはできませんが、この情報はソリューションではありません。すべての種類の狂った回避策の後、そのバグをキャッチしようとすると、私はついにこの作業を見つけました。 WebScoketで動作するためにsocket.ioを使用すると、さまざまなトランスポートテクノロジで動作することができます。 xhrポーリングはFirefoxで動作します。

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

関連する問題