Советы по внедрению "присутствия" для веб-сайта?

В идеале я хотел бы найти простой и легкий код, который позволяет всем веб-клиентам, подключенным к моему сайту, поддерживать в режиме реального времени статус того, кто еще в сети.

Я знаю, что ejabberd делает это, но он также делает много других вещей, и я бы предпочел небольшой объем кода, чтобы я мог настраивать и понимать его характеристики производительности.

Мне нравится неблокирующий аспект node.js, и мне было интересно, есть ли проект с открытым исходным кодом, который выполняет всю эту логику.

Я также хотел бы видеть реализацию JavaScript для поддержки этой модели на стороне клиента.

2 ответа

Для получения статуса в реальном времени используйте http://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()));
    });
});
Другие вопросы по тегам