如何有条件地发送WebSocket消息?

5vf7fwbs  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(88)

我正在为我的服务器使用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。
如何将消息仅发送给聊天中的客户端?

2ul0zpep

2ul0zpep1#

首先,您需要维护每个客户端到其订阅的聊天ID的Map。您可以使用JavaScript Map来实现这一点,其中键是客户端对象,值是它们订阅的聊天ID的数组:

const subscriptionsMap = new Map();

字符串
当客户端连接到WebSocket时,将其订阅信息存储在subscriptionsMap中。当客户端断开连接时,请确保从Map中删除其订阅:

wss.on('connection', (client) => {
  // Handle client connection

  // Assume `json.body.subscriptions` contains the array of chat IDs the client is subscribed to
  subscriptionsMap.set(client, json.body.subscriptions);

  // Handle client disconnection
  client.on('close', () => {
    subscriptionsMap.delete(client);
    // Perform any necessary cleanup
  });
});


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

// Assuming `json.body.chatId` contains the chat ID for the message
const chatId = json.body.chatId;

wss.clients.forEach((client) => {
  if (subscriptionsMap.has(client) && subscriptionsMap.get(client).includes(chatId)) {
    client.send(message);
  }
});

相关问题