AlexPTS
@AlexPTS
Full stack веб разработчик

Есть ли в socket.io уровень клиента?

Каждый таб в браузере на сервере представлен уникальным socket объектом. Хочется не с таким вот коннектом работать, а работать с набором сокетов как с 1 клиентом предметной области.

Пока решил это посредством комнат (room). Все сокеты одного клиента попадают в 1 комнату и сообщение для этого клиента уходит в эту комнату. Но почему-то кажется, что это костыльный вариант и это возможно сделать проще.
  • Вопрос задан
  • 2695 просмотров
Пригласить эксперта
Ответы на вопрос 1
bumbay
@bumbay
Node.JS, MongoDB, PHP
Делайте с помощью массива. Допустим, вы при соединении к socket.io получаете user id.

Записывайте его в объект.

var clients = {}; // global variable node

... соединение {
('u' + user_id in clients ? client['u' + user_id] : clients['u' + user_id] = []).push(socket.id);
... }


В итоге при открытии двух вкладок у вас будет массив:

{
  'u1': [socket_id_hash_one, socket_id_hash_two]
}


И уже при выполнении каких-либо emit у вас будет список socket_id определенного пользователя для которых совершать emit.

Как совершить emit определенному клиенту?
io.sockets.connected[socket_id].emit('data', {data: 123}));


Что делать если пользователь закрыл вкладку?
var clients = {}; // global variable node

... соединение {
('u' + user_id in clients ? client['u' + user_id] : clients['u' + user_id] = []).push(socket.id);
... }
...

setInterval(function () {
  // io.eio.clientsCount — количество подключенных клиентов
  // io.eio.clients — список socket_id подключенных клиентов
  // на основании пишем цикл, который изменяет объект clients в зависимости от io.eio.clients
  // на этом основании можно сделать user online list
}, 500);
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы