2012-10-21 86 views
3

有誰知道爲什麼我的套接字連接在使用xhr-polling時沒有關閉?這是我想要執行的服務器代碼,但在使用xhr-polling時不會觸發。套接字連接工作正常(我運行在帶有stunnel的清漆後面,因爲這是一個安全的套接字)。我嘗試在瀏覽器上手動發出斷開連接事件,但這不是我的最佳解決方案。用XHR輪詢關閉套接字連接

client.on('disconnect', function() { 

    delete connected_clients[id]; 
    console.log(' debug - ' + 'client ' + client.id + 'is disconnected'); 
    console.log(' debug - ' + 'total number of connected clients is ' + Object.keys(connected_clients).length);    

}); 

在我的客戶端代碼,我連接插座這樣的:

socket = io.connect(BASE_URL, { 
    "sync disconnect on unload":true 
}); 

和我的服務器端的設置是這樣的:

io.enable('browser client minification'); // send minified client 
    io.enable('browser client etag');   // apply etag caching logic based on version number 
    io.enable('browser client gzip');   // gzip the file 
    io.set('log level', 3);     // reduce logging 
    io.set('match origin protocol', true);  // ssl support 
    io.set('sync disconnect on unload', true); 
    io.set('transports', [      // enable all transports (optional if you want flashsocket) 
     'xhr-polling', 
     'websocket', 
     'flashsocket', 
     'htmlfile', 
     'jsonp-polling' 
    ]); 

這是調試消息,我得到當客戶端退出瀏覽器時

debug: xhr-polling closed due to exceeded duration 

我正在使用節點0.8.8的socket.io 0.9.10版本。

回答

0

由於連接是在你(服務器)和客戶端(瀏覽器)之間的,所以你在瀏覽器的控制下會關閉連接。如果瀏覽器未通知您它認爲連接已關閉,則無法通知您該連接。

我建議你編程你的客戶端的行爲方式很好地對待你的服務器,當連接被適當的丟棄時通知它。在沒有通知的情況下簡單地忽略連接的情況下,只需在一段時間的不活動(超時)之後關閉連接即可。

認爲它就像你即時通訊的朋友一樣。你的朋友可能會很友好地通知你他們正在離開辦公桌,不再能夠參加對話(斷開連接),或者他們也可以在沒有通知的情況下離開辦公桌(終止瀏覽器進程),或者更糟的是,他們可以心臟病發作會使他們無法參加(停電)。你會在一段時間後明白,他們不再積極參與會話(超時)。

對不起,這裏沒有魔法。你必須對你的服務器進行編程,以處理它可能正在與斷開連接的客戶端交談的事實。