2014-04-10 61 views
1

我使用帶有socket.io的NodeJS作爲我的聊天應用程序。當客戶端刷新/關閉窗口或導航到不同的URL時,我需要客戶端向NodeJS服務器發出「disconnect」事件。所有的作品都與IE8/9的兼容性很好。發生刷新時,「disconnect」事件不會發送到服務器,因此服務器不知道該特定客戶端不再連接。Socket.io不會在IE8/9中向NodeJS發送斷開連接事件

我設法利用:

window.onbeforeunload = function(e) { 
    socket.disconnect(); 
}; 

而這需要單擊後退/前進按鈕的照顧,然後服務器告知客戶端斷開。刷新頁面或關閉選項卡不會發送斷開連接到服務器。看來刷新頁面太快所以socket.disconnect()不具有執行的機會。看起來好像如果我像下面一樣警告,客戶端暫停警報窗口並且服務器收到斷開連接消息。

window.onbeforeunload = function(e) { 
    socket.disconnect(); 
alert("hey watchout!"); 
}; 

現在,有什麼辦法讓頁面刷新時IE8/9發送斷開連接事件給NodeJS嗎?

回答

0

您可以將信息發送來回尋找最後答覆的時間,現在比較它,如果差大於數量越多,斷開客戶端,然後在客戶端重新開始發送時重新連接。

您可以使用類似:

在客戶端:

socket.on('ping',function(){socket.emit('pong',(new Date()).getTime());}); 

在服務器:

socketReferences = new Array(); 
io.on('connection',function(socket){ 
    socketReferences.push(socket); 
    socket.on('pong',function(data){ 
     if(new Date()).getTime()>5000){ 
      // disconnect code here 
     } 
    }); 
}); 

setInterval(function(){ 
    for(socket in socketReferences) 
     socketReferences[socket].emit('ping',''); 
},700); 
相關問題