插座发送到特定房间

时间:2017-09-21 17:03:29

标签: node.js sockets express

我正在使用NodeJS,ExpressJS& Socket.IO。现在为一对一用户聊天室。我可以简单地将它们订阅到特定的聊天室并通过Socket.IO更新消息。 但我陷入困境,让我们说我有以下聊天室。

const rooms = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];

我只想向房间4, 7, 8, 10广播某个消息我该如何从服务器端进行广播。

通常,当我必须在一个房间内发送消息时,我会执行以下操作

const roomid = 4;
global.io.sockets.in(roomid).emit('new message', {  message: newPost });

但是对于这个用例,我有多个房间,如果他们的套接字连接已启动,我想同时向特定房间发出一条消息(意味着用户在线)。

2 个答案:

答案 0 :(得分:1)

您可以拥有一张表格,其中包含您要将信息发送到的房间。在该表中循环并检查房间是否有连接,如果为真,则发送消息。

示例:

const roomsToEmit = ['room1', 'room2', 'room3'];
const message = 'some message';

roomsToEmit.forEach((roomID) => {
    if (io.sockets.adapter.rooms[roomID].length > 0) {
        io.sockets.in(roomID).emit('new message', {  message });
    }
});

如果你想异步地做,但我可能效率不高(我认为socket.io会处理这个问题,因为你在发送到WS时不必等待任何事情)。

const roomsToEmit = ['room1', 'room2', 'room3'];
const message = 'some message';

Promise.all(roomsToEmit.map((room) => {
    return new Promise((resolve, reject) => {
         if (io.sockets.adapter.rooms[roomID].length > 0) {
              io.sockets.in(roomID).emit('new message', {  message });
         } 
         return resolve(roomID);
    });
})
.then((result) => {
    // all messages emited
    // console.log(result) // array of the rooms where a message was emited
});

答案 1 :(得分:0)

socket.to('room name').emit('eventname',data)会将数据发送给会议室中的所有用户,但发件人除外,io.to('room name').emit('eventname',data)会将数据发送给包括发件人在内的所有用户。您可以查看MDN了解更多详情。 你只需要做io.to('1').emit('newMssage',{ message: newPost })