J'utilise javascript et le package ws dans expressjs pour construire mon serveur.
Je suis en train de créer une application de chat pour mon portefeuille et, au départ, mon idée était de demander au client d'indiquer au serveur dans quels chats se trouve l'utilisateur (abonnements) et de les stocker dans un subscriptions
array.
for (let i = 0; i < subscriptions.length; i++) { wss.clients.forEach((client) => { if (json.body.chatId === subscriptions[0][i]){ client.send(message) } }) }
C'est l'approche que je souhaite, mais le message est envoyé à chaque client connecté, ce qui est dommage.
L'objet d'abonnements est simplement un tableau contenant les identifiants des discussions dans lesquelles se trouve l'utilisateur.
Comment envoyer des messages uniquement aux clients qui sont en chat ?
Tout d'abord, vous devez maintenir une méthode qui mappe chaque client à l'ID de chat auquel il est abonné. Vous pouvez le faire en utilisant JavaScript
Map
, où les clés sont des objets clients et les valeurs sont un tableau d'identifiants de discussion auxquels ils sont abonnés :Lorsqu'un client se connecte à WebSocket, il stocke ses informations d'abonnement dans souscriptionsMap. Lorsque les clients se déconnectent, assurez-vous de supprimer leurs abonnements de la carte :
Désormais, lorsque vous recevez un message qui doit être envoyé à un client dans une discussion spécifique, parcourez les clients connectés et envoyez le message uniquement aux clients abonnés à l'ID de discussion correspondant :