理想情况下,我希望找到简单,轻量级的代码,允许连接到我网站的所有网络客户端保持当前在线用户的实时状态。
我知道ejabberd做到了这一点,但它也做了很多其他事情,我更喜欢一个小代码,所以我可以自定义和理解它的性能特征。
我喜欢node.js的非阻塞方面,并且想知道是否有一个开源项目可以完成所有这些逻辑。
我还希望看到在客户端维护此模型的JavaScript实现。
答案 0 :(得分: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);
});
});
答案 1 :(得分:1)
对于将来阅读此内容的任何人。我从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()));
});
});