1

背景: websocket の作成。Chromeで正常に動作します。シングル接続。Firefox では正常に動作しますが、接続が 2 つになり、その理由がわかりません。同じ JavaScript、同じ Web ページ、同じソケット サーバー。

クライアント側 JS:

var ws;
doWebSocketSetup();
function doWebSocketSetup(){
    console.log('Connecting...');
    ws=new WebSocket('ws://mysocketserver.com:9300/demo');

    ws.onopen=function(){
        console.log('Connected!')
        socketSend('connect',sessionStorage.user);
        if(!sessionStorage.announce){
            socketSend('login',sessionStorage.user);
            sessionStorage.announce=true;
        }
        socketSend('view',window.location.href);
        setTimeout(function(){
            processQueue();
        },100);
    }
    ws.onmessage=function(e){
        if(e.data!='ok'){
            $.msg(e.data,{header:'Server Message',live:10000});
            console.log('Server: '+e.data);
        }
        processQueue();
    }
    ws.onclose=function(){
        console.log('Disconnected');
    }
}
var sendQueue=new Array();
function socketSend(action,data){
        var payload = new Object()
        payload.action = action
        payload.client = sessionStorage.user
        payload.data = data
        sendQueue.unshift(payload);
}
function processQueue(){
    if(sendQueue.length==0)
        return;
    var payload=sendQueue.pop()
    console.log('Sending: '+JSON.stringify(payload));
    ws.send(JSON.stringify(payload))
}

そして、Firefox でのサーバー コンソールの出力:

2012-10-18 20:58:53 [info] [client 68.99.226.57:53079] Connected 94e568176299729fa8669c512fdb107d 
2012-10-18 20:58:53 [info] [client 68.99.226.57:53080] Connected 457eb971eabaeba6b6afd637755ce53c 
2012-10-18 20:58:53 [info] [client 68.99.226.57:53080] Performing handshake 
2012-10-18 20:58:53 [info] [client 68.99.226.57:53080] Handshake sent 
2012-10-18 20:58:54 [info] [client 68.99.226.57:53080] _actionConnect 
2012-10-18 20:58:54 [info] [client 68.99.226.57:53080] _actionView 
2012-10-18 20:58:58 [info] [client 68.99.226.57:53079] Disconnected - 94e5681762 99729fa8669c512fdb107d

そしてChromeでは:

2012-10-18 21:09:17 [info] [client 68.99.226.57:53161] Connected 3906f16fa4037cbb08a8a5d1d6094cea
2012-10-18 21:09:17 [info] [client 68.99.226.57:53161] Performing handshake
2012-10-18 21:09:17 [info] [client 68.99.226.57:53161] Handshake sent
2012-10-18 21:09:17 [info] [client 68.99.226.57:53161] _actionConnect
2012-10-18 21:09:17 [info] [client 68.99.226.57:53161] _actionView

Chrome では SINGLE 接続が表示され、適切なハンドシェイクとアクションが呼び出されます。Firefox では、まったく同時に 2 つの接続があり、1 つがハンドシェイクしてアクションを実行します (ブラウザーで意図されていることを行います) が、2 つ目の接続は 5 秒後に開始されます。これはFirefoxだけのものですか?Firebug で 2 つの接続を表示しているのではなく、1 つの接続のみを表示しています。Firefox だけなら正しいデータが送受信されるので我慢できるのですが、そうなると眉をひそめます。

4

1 に答える 1

2

これはFirefox 15のバグであり、決して使用しない投機的接続を作成します (実際には HTTP 接続ではなく WebSocket 接続であるため使用できません)。

Firefox 16 で修正されています。

于 2012-10-19T04:43:14.393 に答える