2012-04-30 4 views
3

Я создаю веб-приложение с узлами (Express) и Socket.IO с функциями чата. Поскольку открытие новой вкладки на странице устанавливает новое соединение сокета, мне нужно сгруппировать все экземпляры одного пользователя в свою комнату на основе идентификатора сеанса Express, чтобы все сообщения, направленные на упомянутого пользователя, отображались на всех дублированных вкладках. Это в дополнение к любой другой комнате/каналу, к которой они, возможно, уже вошли в систему. Как минимум, пользователи подписываются на два чата: реальную «реальную» комнату и свой собственный канал, используя sessionID.Отправка подмножества пользователей в комнате/канале с помощью Socket.IO

Проблема в том, что все сокеты для моего sessionID также находятся в более общей комнате (и должны быть для получения сообщений от других пользователей). Когда я отправляю сообщение общего чата, я хотел бы опустить любые сокеты, соответствующие отправляющему пользователю, так как они уже получили сообщение через свой собственный канал. Я пошел вперед и сделал хэш массивов, содержащих списки идентификаторов socketID для этого сеанса, с ключом на sessionID. Я видел несколько разных синтаксисов для указания списков исключений, но никто не работает для меня.

Соответствующий код, с некоторыми частями опущенными для краткости:

var sessionSockets = {}; 
io.sockets.on('connection', function(socket){ 
    if(!io.sockets.manager.rooms["/" + sessionID]) { 
     sessionSockets[sessionID] = []; 
     //send message indicating log on to all sockets except for my session 
    } 
    socket.join(sessionID); //create private channel for all sockets of the same sessionID 
    sessionSockets[sessionID].push(socket.id); 
    socket.on('chat', function(data){ 
     var payload = { 
      message: data.msg, 
      from: data.user 
     }; 

     //send back as personal message to all sockets for this session 
     io.sockets.in(sessionID).emit('me',payload); 

     //send to everyone else as regular message; WHAT SYNTAX? 
     io.sockets.in('').except(sessionSockets[sessionID]).emit('chat', payload); 
    } 
} 

ТЛ; др: Как я могу отправить сообщение для ряда пользователей в канале/помещении без вручную делать сравнение массивов?

+0

Почему отправить сообщение самому себе в первую очередь? Почему бы просто не транслировать на каждый сокет, который не является исходным сокетом (только то, что делает трансляция). Таким образом, каждая другая вкладка, которую вы сами получили, получит сообщение, как и ожидалось, я полагаю ... – slacktracer

ответ

0

используйте socket.join ('room'), а затем испустите в комнату с помощью socket.in (socket.room) .broadcast.emit.

Это, как вы можете группировать клиентов в комнате и испускают perticular пример комнаты

Смежные вопросы