11

Firefox (少なくとも) では、ESC を押すと、開いているすべての 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 スクリプトの範囲外で実行されているために不可能なのでしょうか?

どんな入力も役に立ちます。

ありがとう!

4

2 に答える 2

5

socket.oncloseイベントにハンドラーをアタッチできます。ESC を押して接続が中断されたときに呼び出されます。

参照: http://jsfiddle.net/w5aAK/1/

現時点で回避できない問題の 1 つは、中断されたエラーがコンソールに出力されることです。現時点では、それをキャプチャする方法はありません。

于 2012-11-29T07:46:50.997 に答える
1

あなたはそれを捕まえることはできません、そしてそれはあなたのせいではありません。FireFoxのバグです。ここに投票してください:

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

私は個人的にあらゆる種類の解決策を試しました:

イベント ハンドラー onunload onbeforeunload onclose try..catch いくつかの js エラー処理 サード パーティ サービスなど。

ソケットをコンソールに記録できます。ソケットはアンロードする前に閉じられますが、FF は別のことを考えます.. :(

解決策(回答に直接回答するではなく、機能します):

これはバグなのでキャッチできませんが、この情報はSolutionではありません。あらゆる種類のクレイジーな回避策とそのバグをキャッチしようとした後、私はついにこれが機能することを発見しました。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.io はトランスポートでは機能しません: [ 'xhr-polling' ]

于 2015-06-18T09:08:12.657 に答える