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 subscriptions
array.
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?
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:Apabila pelanggan menyambung ke WebSocket, ia menyimpan maklumat langganannya dalam subscriptionsMap. Apabila pelanggan memutuskan sambungan, pastikan anda mengalih keluar langganan mereka daripada peta:
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: