我使用的是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 });但是对于这个用例,我有多个房间,如果它们的套接字连接断开(意味着用户在线),我希望同时向特定的房间发出一条消息。
发布于 2017-09-21 17:14:38
您可以有一个房间的桌子,您想要发送您的信息。在该表中循环并检查房间是否有连接,如果为真,则发送消息。
示例:
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
});发布于 2017-09-21 17:14:28
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 })
发布于 2021-11-10 11:27:04
您可以使用此示例。
io.to("room1").to("room2").to("room3").emit("some event");您可以获得有关https://socket.io/docs/v3/rooms/的详细信息。
https://stackoverflow.com/questions/46349478
复制相似问题