我是PubNub的初学者,我的问题是,当多个用户订阅某个频道时,我是否可以根据uuid从服务器端取消订阅其中一个用户?如果没有,请你帮我这样做。
我的项目取决于订阅了一个频道的多个用户,其中服务器端在在线频道上订阅并听取所有状态,我需要服务器端随时取消订阅任何用户吗?
答案 0 :(得分:1)
有几种方法可以实现这一点。一个提供向客户端发送信号以取消订阅的能力,另一个允许完整的服务器端控制。使用聊天室示例,我将介绍如何完成此操作。所有指向PubNub docs are to the Node SDK的链接,但您可以根据需要检查the docs for any other SDK。
您可以使用信号消息使客户端自动执行。
首先,您应该让每个客户订阅一个客户端独有的频道。频道名称可以包括用户的UUID,例如ch-1234-5678-9ABC
。只要您有办法将客户端映射到该频道,您选择的任何命名约定就足够了。
当您的服务器确定客户端应取消订阅频道时,您可以在该客户端的专用频道上发送命令信号以执行操作。消息可能是这样的:
{'command':'leave', 'channel':'chat-abc'}
当客户收到这样的消息时,您的客户端逻辑将在频道unsubscribe
上执行chat-abc
。不需要最终用户(人)的动作。排除远程控制取消订阅,或执行客户端所需的任何操作。
您可以在希望客户端取消订阅的频道上轻松发送命令信号,但是订阅该频道的所有客户端都会获得该消息,而您的客户端代码将具有过滤UUID。不是最有效的方式,但绝对是另一种选择。如果您需要在频道上取消订阅许多或所有客户,则非常有用。您可以传递UUID列表,每个客户端只检查它们的UUID是否在列表中并执行操作(如果是)。您的消息有效负载可能看起来像这样:
{'command':'leave', 'uuids':['1234-5678-9ABC','DEFG-HIJK-LMNO','9876-5432-1ZYX']}
不需要指定频道,因为它适用于服务器发布消息的频道。
以上操作非常简单,但需要服务器和客户端上的代码才能完成所有工作。使用Channel Groups,服务器可以在没有客户参与的情况下获得所有乐趣,除非最初订阅相关频道组。
每个客户都会订阅他们自己的频道组(就像上面的私人频道一样),而不是直接订阅频道。让我们调用频道组cg-1234-5678-9ABC
。因此,我们想要一种方法将通道组映射到特定用户,因此我们将UUID用作名称的一部分。
对于每个需要成为聊天室一部分的客户,chat-abc
就像之前一样,this channel will be added to each users' private channel group。从服务器执行此操作可以将客户端订阅到该通道以及添加到这些通道组的任何其他通道。
当您的服务器确定用户需要从频道取消订阅时,它只能remove that channel from that user's private channel group。这就是它的全部内容。
现在所有这些都很酷,但它并不安全。因为如果好奇的用户想要,他们可以编写一些代码来订阅频道(任何频道或频道组)或将频道添加到他们的频道组,甚至发布到他们想要的任何频道到(甚至是一个没有人听的频道)。
为了防范这种情况,您需要Access Manager并让服务器授予read
权限,以便客户需要订阅的频道或频道组以及write
对该频道的read
权限客户需要发布到。
对于频道组,您的客户只需要read
个频道组的访问权限。添加到这些频道组的所有频道都将继承write
权限,但不会继承任何manage
发布权限 - 必须为每个频道的每个用户授予权限。
您的服务器必须拥有其需要添加的频道组的read
权限。删除通道(当需要每个通道组的权限时,它可以授予自己)。当客户被迫离开频道时(无论您从上面选择哪种方式:频道取消订阅或频道组删除频道),您还会删除该用户的write
和{{1}}权限。是auth-key。
我故意遗漏了Access Manager授予和撤销的详细信息,因为它已在我们的文档或其他SO线程和PubNub博客中充分涵盖。但是,如果您需要有关Access Manager实施的更多帮助,请与PubNub Support联系。