【问题标题】:PubNub best practice: How to manage private rooms?PubNub 最佳实践:如何管理私人房间?
【发布时间】:2012-05-14 14:32:15
【问题描述】:

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

默认情况下,任何人都可以收听频道。 订阅和发布很容易。

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

这些动态房间将被标记,用户应该能够从一个到另一个。

另一个要求是与某人私下交谈不会将您踢出您订阅的其他房间(您仍然可以在聊天时收到通知,告诉您在另一个房间发布了新消息)

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

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

我需要知道实现这一点的最佳方法,因为文档只描述了一个房间的基本场景,互联网上没有关于此的任何内容。

谢谢。

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

PPS:我正在使用带有 socket.io 的 punbub

【问题讨论】:

    标签: private socketchannel multiplexing pubnub


    【解决方案1】:

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

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

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

    YTQyOGFiNWEtNTZmZC00OGVhLTgxZjktMWE3ZmMyMzc3MTRhCg==
    

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

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

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

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

    这是订阅多个订阅源和类别的 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”通道,以便在每个用户的基础上发送/接收消息。以及推送所有公共聊天室数据的公共“聊天”频道。多路复用对于公共聊天很重要。

    【讨论】:

    • 谢谢。很高兴能得到PubNub创始人本人的答复!我阅读了这些参考资料,但作为初学者,我不得不承认我正在努力解决一些差距。私有频道作为一个概念很容易获得,但没有示例展示如何从头到尾实现它们。这不是抱怨,因为我相信这对任何受过教育的开发人员来说都是有意义的,但对我来说,这是一个相当大的考验。我只是发现它不是我需要声明以便与目标用户通信的通道,而是“socket.emit”方法的第一个参数。很简单,但我没有在任何地方读过。
    • @Pubnub。史蒂文,首先你是个皮条客!看了你的 vimeo 视频。你们应该多做一些。我真正希望看到的是一个用 pubnub 构建的真正的聊天应用程序。就像一个完整的 Olark 克隆。那将是一个足够复杂的项目,可以包括多路复用,并让我们对可以构建的内容有一个真实的深入了解。更不用说订阅 pubnub 的充分理由了。另外,能否请您添加 ASP(经典)示例,如果可能,最后将 XMPP 添加到 pubnub。我不知道是否可能,但让 jabber 客户端连接到 pubnub 会很糟糕。
    • 抱歉,您的 API 的链接有些损坏。
    • 您好 Dunc,感谢您提供详细信息。我会尽快更新。
    • 404 链接无处不在
    【解决方案2】:

    要添加到上一个答案,我不确定这是否只是我的黑客行为,但是为了与当前的 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 );
    

    现在您可以继续在专用通道上创建新的秘密套接字。

    【讨论】:

      【解决方案3】:

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

      其工作方式是通过访问令牌(也称为“身份验证密钥”)。开发人员(您)创建一个 Auth Key(基本上是任何字符串)并将其传递给 PubNub Access Manager。然后,您为此 Auth Key 设置规则(即 Auth Key 可以发布和/或订阅哪些频道)。

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

      基本文档可在此处获得:http://www.pubnub.com/docs/javascript/tutorial/access-manager.html

      授予 60 分钟读/写权限,以将“privateChat”引导到 auth_key:

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

      【讨论】:

        猜你喜欢
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 2015-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        相关资源
        最近更新 更多