背景: 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 だけなら正しいデータが送受信されるので我慢できるのですが、そうなると眉をひそめます。