关于为网站实施“存在”的建议?

问题描述 投票:2回答:2

理想情况下,我希望找到简单,轻量级的代码,允许连接到我的网站的所有Web客户端保持当前在线的其他人的实时状态。

我知道ejabberd这样做,但它也做了很多其他的事情,我更喜欢一个小的代码占用空间,所以我可以自定义和理解它的性能特征。

我喜欢node.js的非阻塞方面,并且想知道是否有一个开源项目可以完成所有这些逻辑。

我还想看到一个在客户端维护这个模型的JavaScript实现。

node.js nonblocking ejabberd user-presence
2个回答
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
投票

对于将来读这篇文章的人。我从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()));
    });
});
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.