2017-09-21 48 views
0

我正在使用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 }); 

但对于这种使用情况下,我有多个房间,我想发出特定的房间在一个单一的消息同一时间,如果他们的套接字连接(表示用户在线)。

+1

https://stackoverflow.com/questions/18304236/sending-messages-to-multiple-rooms-using-socket-io –

回答

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 
}); 
+0

是否有任何其他方法,我不必为此使用for循环或任何循环。 –

+0

不幸的是,不是我所知道的。即使socket.io a提供了一种像'io.sockets.in([1,2,3])这样的方式。emit('new message',{message});'它会在引擎盖下做一个循环 –

+0

I我正在寻找一种方法,我可以最佳地做到这一点。我应该用循环,基于队列的系统来完成它。这里最好的方法是什么? –

-1

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

+0

我想办法,我可以一次发送数据到多个房间。 –

相关问题