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