我正在使用具有聊天功能的Node(Express)和Socket.IO构建Web应用程序。因为在页面上打开新选项卡会建立新的套接字连接,所以我需要根据Express会话ID将单个用户的所有实例分组到自己的房间,以使所有针对所述用户的消息都显示在所有重复的选项卡中。这是他们可能已经登录的任何其他房间/频道的补充。用户至少可以订阅两个聊天室:实际的"真实"房间,以及使用sessionID的自己的频道。
问题是我的sessionID的所有套接字也在更一般的空间中(并且需要从其他用户获取消息)。当我发出一般聊天消息时,我想省略与发送用户对应的任何套接字,因为他们已经通过他们自己的频道收到了消息。我已经完成了一个包含该会话的套接字ID列表的数组哈希,这些套接字是在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 :(得分:0)
使用socket.join('room')然后使用socket.in(socket.room).broadcast.emit发送到房间。
这是你如何在一个房间里对客户进行分组并向房间发出一个特定的例子