PubNub最佳实践:如何管理私人房间?

时间:2012-05-05 05:23:00

标签: private socketchannel multiplexing pubnub

我正在学习pubnub并且我阅读了他们的文档,但我找不到如何管理多房间聊天框。

默认情况下,任何人都可以收听某个频道。 订阅它并在其上发布很容易。

我想要的是拥有一个主要的公共房间(到目前为止一样好),但任何人都应该能够私下与其他人交谈而不会被其他用户阅读。

这些动态房间会有标签,用户应该可以从一个房间到另一个房间。

另一项要求是,私下与某人交谈不会让您离开您订阅的其他房间(您仍然可以通知您在聊天时在另一个房间发布了新消息)

实现这一目标的最佳做法是什么?

  • 我会使用不同的频道(动态创建)吗?
  • 我会使用一个频道并根据其状态,伪房间ID或主角过滤消息吗?
  • 我会使用多路复用(仅限一个插槽)吗?

我需要知道实现这一目标的最佳方法,因为文档仅描述了单个房间的基本情景,而且互联网上没有任何内容。

谢谢。

PS:我知道PubNub一次不推荐超过2个频道(尽管我很难找到相应的解释)。

PPS:我正在使用punbub和socket.io

3 个答案:

答案 0 :(得分:10)

Socket.IO和PubNub管理聊天服务的私人房间

您正在寻找一种方法来创建一个多房间聊天服务,可能类似于IRC客户端,您可以在其中加入并坐在多个聊天室中(例如,在freenode.net上)。这是可能的,并且需要一些特殊的任务才能使你正确。

首先打开两个频道,一个用于主聊天室,一个用于私人“ME”侧聊天。使用此侧私有“ME”频道,您需要创建一个长且不可预测的会话ID样式频道名称,通常如下所示:

YTQyOGFiNWEtNTZmZC00OGVhLTgxZjktMWE3ZmMyMzc3MTRhCg==

这就像用户的参考ID。此ID可用于私人1对1聊天,而其他房间可用于群聊。您将使用我们称之为PubNub Access Manager(PAM)的访问控制管理来保护此群聊。

对于其他安全实践,您需要查看我们的帮助台和知识库中PubNub Support for Security上提供的安全建议指南。

现在我们已经建立了私有频道,通过您的私人服务器(可以提供授权的服务器)发送和接收聊天,以允许基于每个用户中继消息,可以实现安全通信。您可以通过阅读PubNub上Sending Events from a Server to a Socket IO Client文档的这一部分来了解如何执行此操作。

第二个频道将用于所有房间的公共聊天。对于Multi-tab支持,您只需通过io.connect()方法添加新房间,即可在PubNub上使用Socket IO的通道多路复用功能。每次打开一个新选项卡时,您将通过io.connect()打开一个新的命名空间,您可以无限制地使用它。但请注意,您一次只能连接到不超过2个PubNub频道(您已在问题中注明过)。

以下是订阅多个Feed和类别的PubNub Socket IO方法:

Socket.IO文档

https://github.com/pubnub/pubnub-api/tree/493d7fc97fb683379fc78be3ca7ad9bc97eb4200/socket.io#restricting-yourself-to-a-namespace

Vimeo上的Socket.IO视频

http://vimeo.com/34496366

示例Socket.IO多路复用代码

https://github.com/pubnub/pubnub-api/tree/493d7fc97fb683379fc78be3ca7ad9bc97eb4200/socket.io/multiplexing

作为一个快速的结论,您将使用安全方法建立一个私人“ME”频道,以便按用户发送/接收消息。以及推送所有公共聊天室数据的公共“聊天”频道。多路复用对于公众聊天很重要。

答案 1 :(得分:6)

上面的答案在2012年是正确的,但从那以后发生了很多变化。私人聊天室可以使用PubNub Access Manager启用,该管理器明确授予特定频道的发布/订阅访问权限。

这种方式的工作方式是通过访问令牌(又名" Auth Key")。开发人员(您)创建一个Auth Key(基本上是任何字符串)并将其传递给PubNub Access Manager。然后,您可以为此Auth Key设置规则(即,Auth Key可以发布和/或订阅哪些渠道)。

此Auth Key提供给需要访问该频道的任何设备,并在设备订阅或发布到该频道时使用。

此处提供了基本文档:http://www.pubnub.com/docs/javascript/tutorial/access-manager.html

为频道" privateChat"授予60分钟的读/写权限。到auth_key:

 pubnub.grant({
 channel  : 'privateChat',
 auth_key : 'abxyz12-auth-key-987tuv',
 read     : true,
 write    : true,
 ttl      : 60
 });

答案 2 :(得分:0)

要添加到上一个答案,我不确定这是否只是我的黑客攻击,但为了与当前的socket-io库建立多通道连接,你需要设置io.connected = false;在传入另一个通道配置对象之前。

例如:

var pubnub_setup = {
  channel       : 'public_channel',
  publish_key   : 'demo',
  subscribe_key : 'demo'
};

var private_setup = {
  channel       : 'private_channel',
  publish_key   : 'demo',
  subscribe_key : 'demo'
};

// Make your public socket connections
var publicSocket = io.connect( 'http://pubsub.pubnub.com/pub_socket', pubnub_setup );
var anotherPublicSocket = io.connect( 'http://pubsub.pubnub.com/another_pub_socket', pubnub_setup);

// Set false otherwise you keep getting back the previous created socket which is
// bound to the original channel 'public_channel'
io.connected = false;
var secretSocket = io.connect( 'http://pubsub.pubnub.com/secret_mulitplex_socket_namespace', private_setup );

现在,您可以继续在私人频道上创建新的秘密套接字。