3

理想情况下,我想找到简单、轻量级的代码,让所有连接到我的站点的 Web 客户端都可以保持其他人当前在线的实时状态。

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

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

我还希望看到在客户端维护此模型的 JavaScript 实现。

4

2 回答 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);
  });
});
于 2011-12-29T00:02:52.000 回答
1

对于任何将来阅读本文的人。我从 写的答案开始fent,但我需要进行一些修改,因为在他的答案发表后的 6 年里,情况发生了变化。

我使用 aMap而不是 anObject来存储会话信息。这意味着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()));
    });
});
于 2017-12-12T21:24:30.373 回答