Советы по внедрению «присутствия» для веб-сайта? - PullRequest
2 голосов
/ 29 декабря 2011

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 29 декабря 2011

Для статуса в реальном времени используйте 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 голос
/ 13 декабря 2017

Для тех, кто читает это в будущем.Я начал с ответа, написанного 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()));
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...