如何有条件地发送WebSocket消息?
P粉933003350
P粉933003350 2023-09-18 14:56:33
0
1
566

我正在使用javascript和expressjs中的ws包来搭建我的服务器。

我正在为我的作品集构建一个聊天应用程序,最初我的想法是让客户端告诉服务器用户在哪些聊天中(订阅)并将它们存储在一个subscriptions数组中。

for (let i = 0; i < subscriptions.length; i++) {
        
          wss.clients.forEach((client) => {
            if (json.body.chatId === subscriptions[0][i]){
              client.send(message)
          }
        })
      }

这是我想要的方法,但是消息会发送给每个连接的客户端,这太糟糕了。

subscriptions对象只是一个包含用户所在聊天的id的数组。

如何只向在聊天中的客户端发送消息?

P粉933003350
P粉933003350

全部回复(1)
P粉198749929

首先,您需要维护一个将每个客户端与其订阅的聊天ID进行映射的方法。您可以使用JavaScript的Map来实现,其中键是客户端对象,值是他们订阅的聊天ID的数组:

const subscriptionsMap = new Map();

当客户端连接到WebSocket时,将其订阅信息存储在subscriptionsMap中。当客户端断开连接时,确保从映射中删除他们的订阅:

wss.on('connection', (client) => {
  // 处理客户端连接

  // 假设`json.body.subscriptions`包含客户端订阅的聊天ID数组
  subscriptionsMap.set(client, json.body.subscriptions);

  // 处理客户端断开连接
  client.on('close', () => {
    subscriptionsMap.delete(client);
    // 执行任何必要的清理操作
  });
});

现在,当您收到需要发送给特定聊天中的客户端的消息时,遍历连接的客户端,并仅将消息发送给订阅相关聊天ID的客户端:

// 假设`json.body.chatId`包含消息的聊天ID
const chatId = json.body.chatId;

wss.clients.forEach((client) => {
  if (subscriptionsMap.has(client) && subscriptionsMap.get(client).includes(chatId)) {
    client.send(message);
  }
});
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!