2012-04-30 29 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發送到房間。

這就是你如何在一個房間中分組客戶,並向房間發出一個具體的例子

相關問題