我正在学习pubnub并且我阅读了他们的文档,但我找不到如何管理多房间聊天框。
默认情况下,任何人都可以收听某个频道。 订阅它并在其上发布很容易。
我想要的是拥有一个主要的公共房间(到目前为止一样好),但任何人都应该能够私下与其他人交谈而不会被其他用户阅读。
这些动态房间会有标签,用户应该可以从一个房间到另一个房间。
另一项要求是,私下与某人交谈不会让您离开您订阅的其他房间(您仍然可以通知您在聊天时在另一个房间发布了新消息)
实现这一目标的最佳做法是什么?
我需要知道实现这一目标的最佳方法,因为文档仅描述了单个房间的基本情景,而且互联网上没有任何内容。
谢谢。
PS:我知道PubNub一次不推荐超过2个频道(尽管我很难找到相应的解释)。
PPS:我正在使用punbub和socket.io
答案 0 :(得分:10)
您正在寻找一种方法来创建一个多房间聊天服务,可能类似于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方法:
作为一个快速的结论,您将使用安全方法建立一个私人“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 );
现在,您可以继续在私人频道上创建新的秘密套接字。