2012-12-11 24 views
6

我有插座IO和快速增加這樣的的NodeJS應用:套接字io用戶連接添加在每個html頁面上刷新?

服務器:

var storeEachSocket=[]; 
var io = require('socket.io').listen(80); 
io.sockets.on('connection', function (socket) { 
    storeEachSocket.push(socket); 
    console.log(storeEachSocket.length); 
    var clients = io.sockets.clients(); //clients is an array 
    console.log(clients.length); 
}); 

客戶:

<script src="/socket.io/socket.io.js"></script> 
<script> 
var socket = io.connect('http://localhost'); 
</script> 

目前只有一個由服務器提供的HTML頁面。 我發現,在html和服務器之間建立套接字連接之後(此時storeEachSocket.length爲1,而clients.length爲1),並且如果我刷新這個html頁面,storeEachSocket.length和clients.length都是2,表明這個html和服務器之間有2個套接字連接。我想知道這是正常的嗎?即使在創建第二個套接字連接之後,第一個套接字連接也不會消失?

我也想知道,如果我打算跟蹤這個用戶(html),如果一個用戶使用了兩個套接字連接,我該怎麼辦?

回答

9

刷新頁面不會添加新連接,它基本上會刪除當前連接並創建另一個新連接。我想你應該添加一個監聽器來斷開連接事件並刪除已斷開連接的數組中的套接字。我也不相信io.sockets.clients()會在刷新後返回2,因爲我已經在我的機器上測試過了。

如果您想跟蹤用戶,您需要有一個用戶ID並將其存儲到鍵/值對集合中。然後,您可以通過檢查thr授權處理程序中的集合來限制用戶創建2個連接。

var storeEachSocket = {}; 
    io.set('authorization', function(handshake, accept){ 
     var user = handshake.query; 
     if(user.id in storeEachSocket) 
     accept('User already connected', false); 
     else 
     accept(null, true); 
    }); 

    io.on('connection', function(socket){ 
     var user = socket.handshake.query; 
     storeEachSocket[user.id] = socket; 
    }); 

    io.on('disconnect', function(socket){ 
     var user = socket.handshake.query; 
     delete storeEachSocket[user.id] 
    }); 
+0

很好,非常感謝。 – user1893787

+0

socket.handshake.query不包含socket.handshake.query – Sever

相關問題