Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 插座发射到特定房间_Node.js_Sockets_Express - Fatal编程技术网

Node.js 插座发射到特定房间

Node.js 插座发射到特定房间,node.js,sockets,express,Node.js,Sockets,Express,我正在使用NodeJS、ExpressJS和Socket.IO。现在是一对一用户聊天室。我可以简单地向他们两人订阅一个特定的聊天室,并通过Socket.IO更新消息。 但是我陷入了这样一种境地,我们可以说我有以下聊天室 const rooms = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 我只想向room4、7、8、10播送一条特定的消息,我怎样才能从服务器端做到这一点 一般来说,当我必须在一个单人房间里发送信息时,我会执行以下操作 const roomid = 4

我正在使用NodeJS、ExpressJS和Socket.IO。现在是一对一用户聊天室。我可以简单地向他们两人订阅一个特定的聊天室,并通过Socket.IO更新消息。 但是我陷入了这样一种境地,我们可以说我有以下聊天室

const rooms = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
我只想向room
4、7、8、10播送一条特定的消息,我怎样才能从服务器端做到这一点

一般来说,当我必须在一个单人房间里发送信息时,我会执行以下操作

const roomid = 4;
global.io.sockets.in(roomid).emit('new message', {  message: newPost });
但是对于这个用例,我有多个房间,如果他们的套接字连接已打开(意味着用户处于联机状态),我希望同时向特定房间发送一条消息。

socket.to('room name')。emit('eventname',data)
将数据发送给房间中除发送者以外的所有用户,
io.to('room name')。emit('eventname',data)
将向包括发件人在内的所有用户发送数据。您可以查看更多详细信息。
您只需要执行
io.to('1').emit('newMssage',{message:newPost})

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

例如:

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-Server发送时不必等待任何东西)


是否有其他方法不必使用for循环或任何循环来实现此目的。不幸的是,我不知道。即使socket.io a确实提供了类似
io.sockets.in([1,2,3]).emit('new message',{message})的方法
它可以在后台进行循环我正在寻找一种方法,在这种方法中我可以做到最好。我应该使用循环,一种基于队列的系统来进行循环。这里最好的方法是什么?我相信循环是好的,你可以将它封装在函数中。我已经更新了我的答案,给出了一种异步进行循环的方法,但我不确定它是否更有效,也许是这样当您在许多房间中循环时。您必须对其进行基准测试。感谢您的帮助,我认为现在就可以了。我可能需要做一些事情来对其进行基准测试:)我想要一种可以同时将数据发送到多个房间的方法。
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
});