搜尋

首頁  >  問答  >  主體

如何有條件地發送WebSocket訊息?

我正在使用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粉933003350P粉933003350556 天前729

全部回覆(1)我來回復

  • P粉198749929

    P粉1987499292023-09-19 11:34:05

    首先,您需要維護一個將每個用戶端與其訂閱的聊天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);
      }
    });

    回覆
    0
  • 取消回覆