javascript - 使用 Socket.IO 发送到房间/ channel 中的用户子集

标签 javascript node.js socket.io

我正在使用 Node (Express) 和 Socket.IO 构建一个具有聊天功能的 Web 应用程序。因为在页面上打开一个新选项卡会建立一个新的套接字连接,所以我需要根据 Express session ID 将单个用户的所有实例分组到他们自己的房间中,以使针对该用户的所有消息都出现在所有重复的选项卡中。这是他们可能已经登录的任何其他房间/ channel 的补充。至少,用户订阅了两个聊天室:实际的“真实”房间,以及他们自己使用 sessionID 的 channel 。

问题是我的 sessionID 的所有套接字也都在更普通的房间里(并且需要从其他用户那里获取消息)。当我发送一般聊天消息时,我想省略与发送用户对应的任何套接字,因为他们已经通过自己的 channel 接收到消息。我已经做了一个数组散列,其中包含该 session 的 socketID 列表,以 sessionID 为键。我见过几种用于指定异常(exception)列表的不同语法,但似乎没有一种适合我。

相关代码,部分省略:

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:如何在不手动比较数组的情况下向 channel /房间中的一部分用户发送消息?

最佳答案

使用 socket.join('room') 然后使用 socket.in(socket.room).broadcast.emit 发射到房间。

这就是您可以将客户分组到一个房间并向房间发送特定示例的方法

关于javascript - 使用 Socket.IO 发送到房间/ channel 中的用户子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10389237/

相关文章:

javascript - 当调用设定的间隔函数时触发倒计时

mysql - 如何在 ionic 4 客户端应用程序和 Express 服务器之间建立连接?

session - 套接字请求的 Sails.js 授权

javascript - socket.io 无法在 Express app.post 回调中发出

javascript - 有谁知道您是否可以在没有当前 URL 的情况下在 Google 获得 javascript 的 API key ?

javascript - Chrome DevTools 中的 Handled 过滤器有什么用?

javascript - 在固定大小的 div 中带有文本标题的图像

windows - NodeJS子进程PID与真实进程不符

node.js - 将渲染网页中的内容读取到nodejs中

javascript - 连接IO未登录控制台