2011-12-28 69 views
2

理想情況下,我想找到簡單,輕量級的代碼,允許連接到我的網站的所有Web客戶端保持其他人當前在線的實時狀態。關於爲網站實施「呈現」的建議?

我知道ejabberd做到了這一點,但它也做了很多其他的事情,我更喜歡一個小代碼足跡,所以我可以定製和理解它的性能特徵。

我喜歡node.js的非阻塞方面,並想知道是否有一個開源項目能夠完成所有這些邏輯。

我也想看到在客戶端維護這個模型的JavaScript實現。

回答

5

對於實時狀態,請使用socket.io。每當有人連接時,將它們添加到連接的用戶列表中。要獲得準確的統計數據,您需要跟蹤用戶會話。請參閱http://www.danielbaulig.de/socket-ioexpress/

var onlineUsers = {}; 
var online = 0; 

io.sockets.on('connection', function (socket) { 
    onlineUsers[socket.handshake.sessionID] = socket.handshake.session; 
    online = Object.keys(onlineUsers).length; 
    socket.broadcast.emit('online', online); 

    socket.on('disconnect', function() { 
    delete onlineUsers[socket.handshake.sessionID]; 
    online--; 
    socket.broadcast.emit('online', online); 
    }); 
}); 
0

對於任何人在將來閱讀此內容。我從fent開始寫回答,但是我需要一些修改,因爲在他的答案發表後的6年中,事情已經發生了變化。

我用Map而不是Object來存儲會話信息。這意味着sessionID不再需要。

const onlineUsers = new Map(); 

io.on('connection', function (socket) { 
    console.log('connection initiated'); 

    socket.on('userInfo', userInfo => { 
     console.log('userInfo', userInfo); 

     onlineUsers.set(socket, userInfo); 

     io.emit('onlineUsers', Array.from(onlineUsers.values())); 
    }); 

    socket.on('disconnect', function() { 
     console.log(onlineUsers.get(socket)); 

     onlineUsers.delete(socket); 

     io.emit('onlineUsers', Array.from(onlineUsers.values())); 
    }); 
});