2012-04-30 28 views
3

我正在构建具有聊天功能的Node(Express)和Socket.IO的Web应用程序。由于在页面上打开新选项卡会建立新的套接字连接,因此我需要根据Express会话标识将单个用户的所有实例分组到自己的房间中,以使针对所述用户的所有消息都能出现在所有重复标签中。除了可能已经登录的任何其他房间/频道之外。至少,用户订购了两个聊天室:实际的“真实”聊天室以及使用sessionID的自己的频道。使用Socket.IO发送到房间/频道中的用户子集

问题是,我sessionID的所有套接字也在更普通的房间(并且需要从其他用户获取消息)。当我发送一般聊天消息时,我想省略与发送用户对应的任何套接字,因为他们已经通过他们自己的频道接收到了该消息。我已经提前完成了包含该会话套接字标识列表的数组哈希,并将其键入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); 
    } 
} 

TL; DR:我怎样才能在一个信道/间发送消息给用户的子集,而无需手动操作的方式的阵列的比较?

+0

为什么先发送消息给自己?为什么不直接向每个不是原始套接字的套接字进行广播(就像广播一样)。按照预期,我认为你自己拥有的每个其他标签都会收到这条消息...... – slacktracer

回答

0

使用socket.join('room'),然后通过使用socket.in(socket.room).broadcast.emit发送到房间。

这就是你如何在一个房间中分组客户,并向房间发出一个具体的例子

相关问题