我正在使用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的陣列。
如何只傳送訊息給在聊天中的客戶端?
首先,您需要維護一個將每個用戶端與其訂閱的聊天ID進行對應的方法。您可以使用JavaScript的
Map
來實現,其中鍵是客戶端對象,值是他們訂閱的聊天ID的數組:當客戶端連接到WebSocket時,將其訂閱資訊儲存在subscriptionsMap中。當客戶端斷開連線時,請確保從映射中刪除他們的訂閱:
現在,當您收到需要發送給特定聊天中的客戶端的訊息時,遍歷連接的客戶端,並僅將訊息發送給訂閱相關聊天ID的客戶端: