我正在使用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的客户端: