@kr_ilya

Как считать онлайн на сайте?

Необходимо сделать счетчик онлайна на сайте
node.js
socket.io

Из наработок
let online = 0,
    ipsConnected = []; //список подключенных ip

io.on('connection', async (socket) => {
    if(socket.handshake.headers['x-forwarded-for'] !== undefined){
      var address = socket.handshake.headers['x-forwarded-for'];
    }else{
      var address = socket.handshake.headers["x-real-ip"];
    }

    if(!ipsConnected.hasOwnProperty(address)) {
        ipsConnected[address] = 1;
        online++;
    }

socket.on('disconnect', () => {
        delete ipsConnected[address];
        online--;
	});

});


Но такой подход не совсем рабочий. Если открыть сайт, скажем, на телефоне и на пк, то онлайн будет равен 1. Так и должно быть, ведь для всех подключений с одного ip считаем онлайн за 1. Но, если на одном из устройств закрыть сайт, онлайн будет равен 0, несмотря на то, что человек всё ещё на сайте.

Как лучше реализовать счетчик онлайна? Или есть готовые примеры кода на node и socket.io дабы не изобретать велосипед?
  • Вопрос задан
  • 765 просмотров
Решения вопроса 2
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
socket.io уже давно не актуален и не дает ничего кроме оверхеда.
Используйте чистый https://www.npmjs.com/package/ws
получить число всех активных соединений wss.clients.length
https://www.npmjs.com/package/ws#server-broadcast
Чтобы отсеять дубли нескольких открытых вкладок браузера используйте сессионные куки с рандомным идентификатором ( куки можно извлечь из request в этом примере https://www.npmjs.com/package/ws#client-authentication ).
Как получите идентификатор присвойте его клиенту ws.awesomeRandomId = <идентификатор>.
awesomeRandomId - произвольное имя, какое вам удобно.
Далее в https://www.npmjs.com/package/ws#server-broadcast у каждого client появится awesomeRandomId, по которому можно отсеять дубли.
Ответ написан
Комментировать
let online = 0,
ipsConnected = {}; //список подключенных ip

io.on('connection', async (socket) => {
    let address;

    if (socket.handshake.headers['x-forwarded-for'] !== undefined) {
      address = socket.handshake.headers['x-forwarded-for'];
    } else {
      address = socket.handshake.headers["x-real-ip"];
    }

    if (!ipsConnected.hasOwnProperty(address)) {
        ipsConnected[address] = 1;
        online++;
    } else {
        ipsConnected[address] += 1;
    }

    socket.on('disconnect', () => {
        ipsConnected[address] -= 1;

        if (ipsConnected[address] <= 0) {
            delete ipsConnected[address];
            online--;
        }
  });
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы