理想情況下,我想找到簡單,輕量級的代碼,允許連接到我的網站的所有Web客戶端保持其他人當前在線的實時狀態。關於爲網站實施「呈現」的建議?
我知道ejabberd做到了這一點,但它也做了很多其他的事情,我更喜歡一個小代碼足跡,所以我可以定製和理解它的性能特徵。
我喜歡node.js的非阻塞方面,並想知道是否有一個開源項目能夠完成所有這些邏輯。
我也想看到在客戶端維護這個模型的JavaScript實現。
理想情況下,我想找到簡單,輕量級的代碼,允許連接到我的網站的所有Web客戶端保持其他人當前在線的實時狀態。關於爲網站實施「呈現」的建議?
我知道ejabberd做到了這一點,但它也做了很多其他的事情,我更喜歡一個小代碼足跡,所以我可以定製和理解它的性能特徵。
我喜歡node.js的非阻塞方面,並想知道是否有一個開源項目能夠完成所有這些邏輯。
我也想看到在客戶端維護這個模型的JavaScript實現。
對於實時狀態,請使用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);
});
});
對於任何人在將來閱讀此內容。我從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()));
});
});