Bagaimana untuk menghantar mesej WebSocket secara bersyarat?
P粉933003350
P粉933003350 2023-09-18 14:56:33
0
1
652

Saya menggunakan javascript dan pakej ws dalam expressjs untuk membina pelayan saya.

Saya sedang membina apl sembang untuk portfolio saya dan pada mulanya idea saya ialah meminta pelanggan memberitahu pelayan tempat sembang yang digunakan pengguna (langganan) dan menyimpannya dalam subscriptionsarray.

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

Ini adalah pendekatan yang saya mahukan, tetapi mesej dihantar kepada setiap pelanggan yang berkaitan, yang terlalu teruk.

Objek langganan hanyalah tatasusunan yang mengandungi id sembang yang digunakan pengguna.

Bagaimana untuk menghantar mesej hanya kepada pelanggan yang berada dalam sembang?

P粉933003350
P粉933003350

membalas semua(1)
P粉198749929

Pertama, anda perlu mengekalkan kaedah yang memetakan setiap pelanggan ke ID sembang yang dilangganinya. Anda boleh melakukan ini menggunakan JavaScript's Map, di mana kuncinya ialah objek pelanggan dan nilainya ialah pelbagai ID sembang yang mereka langgan:

const subscriptionsMap = new Map();

Apabila pelanggan menyambung ke WebSocket, ia menyimpan maklumat langganannya dalam subscriptionsMap. Apabila pelanggan memutuskan sambungan, pastikan anda mengalih keluar langganan mereka daripada peta:

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

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

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

Sekarang apabila anda menerima mesej yang perlu dihantar kepada pelanggan dalam sembang tertentu, ulangi melalui pelanggan yang disambungkan dan hantar mesej hanya kepada pelanggan yang melanggan ID sembang yang berkaitan:

// 假设`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);
  }
});
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan