我正在使用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 });
但是对于这个用例,我有多个房间,如果他们的套接字连接已启动,我想同时向特定房间发出一条消息(意味着用户在线)。
答案 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 })