【问题标题】:Socket Emit To Specific Rooms套接字发射到特定房间
【发布时间】:2018-03-03 03:12:26
【问题描述】:

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

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

【问题讨论】:

标签: node.js sockets express


【解决方案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 })

【讨论】:

  • 我想要一种可以同时向多个房间发送数据的方法。
【解决方案2】:

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

例子:

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

【讨论】:

  • 是否有任何其他方法我不必为此目的使用 for 循环或任何循环。
  • 不幸的是,我不知道。即使 socket.io a 确实提供了像 io.sockets.in([1,2,3]).emit('new message', { message }); 这样的方式,它也会在引擎盖下做一个循环
  • 我正在寻找一种可以优化执行此操作的方法。我应该用一个循环来做吗,一个基于队列的系统。这里最好的方法是什么?
  • 我相信循环很好,你可以把它包装在函数中。我已经更新了我的答案,以提供一种异步执行此操作的方法,但我不确定它是否更有效,也许是当您在很多房间中循环时。您必须对其进行基准测试。
  • 感谢您的帮助,我想现在就可以了。不过,我可能不得不做一些事情来对其进行基准测试:)
【解决方案3】:

你可以使用这个例子

io.to("room1").to("room2").to("room3").emit("some event");

你可以有详细的信息 https://socket.io/docs/v3/rooms/

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 2018-02-22
    • 2016-11-04
    • 1970-01-01
    • 2017-12-04
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多