3

我想知道如何在 Rails 应用程序中使用 PubNub 实现用户存在,但我没有找到关于如何在服务器端和客户端实现此功能的完整指南。

4

1 回答 1

4

PubNub Presence 与 Ruby 和 JavaScript

按照这个连接两个 PubNub SDK 之间状态的简短指南,在 Ruby 和 JavaScript 中轻松开始使用 PubNub Presence。首先,您需要确保在您的服务器上安装了最新的PubNub Ruby GEM客户端 SDK。但在我们进入编码方面之前,我们可以谈谈PubNub Presence实际上是什么。

PubNub 存在介绍

PubNub Presence 允许您提出“谁在那儿?”的问题。并以用户 ID 列表和当前在线人数 的形式接收答案。

通常你在 PubNub 频道的上下文中问这个问题。用户连接到 PubNub 频道以便从 PubNub 网络接收数据流。您可以通过 Channels 通过任何有效的 UTF-8 字符串发布和订阅频道来控制流。有时您想通过请求频道上的当前活动和已连接用户列表来了解 PubNub 频道的当前状态。您可以使用 PubNub Presence 功能来做到这一点,该功能提供您寻求的答案。

PubNub Presence SDK

让我们首先列出为您的目标平台包含/加载 GEM 和 JavaScript SDK 的两个起始步骤(这次是 Ruby+JavaScript 组合)。

安装 PubNub Ruby GEM

sudo gem install pubnub

接下来,您将确保在 JavaScript 客户端应用程序(通常是手机应用程序或网站应用程序)上运行最新的 JavaScript SDK 之一。

包含 PubNub JavaScript 客户端 SDK

<script src=http://cdn.pubnub.com/pubnub-3.4.2.min.js ></script>

现在您已经访问了 Ruby 和 JavaScript 的两个必要的基础 SDK 库,您可以通过 PubNub 网络自由地接收/传输信息。接下来,我们将讨论如何轻松接收 PubNub 频道上发生的在线状态事件,以及如何使用here_now()API 直接查询当前频道状态。

PubNub 开发控制台 - 存在

使用PubNub 开发人员的控制台来监控存在事件。

您可以使用 PubNub 开发者的控制台来观察 Presence 事件的发生。您将能够在呈现部分中以 JSON 形式看到事件有效负载,如下图所示:

"action"您可以接收三个事件,包括:

  • "join"- 新用户加入频道。
  • "leave"- 用户离开了频道。
  • "timeout"- 用户断开连接并超时。

带有 REST 的 PubNub 存在

PubNub 现在在这里

使用 PubNub Presence,您可以访问两条 REST 路由。最简单的路线是here_now()路线。

带有 SDK 的 PubNub 存在

JavaScript 中的示例源代码

以下是 JavaScript 中的方法示例,用于在 Channel 上接收数据并在该通道实时发生时接收该通道的 Presence Events。您还会注意到在函数回调中传递给您的参数。此方法允许您将数据流接收到您的 JavaScript 应用程序中。请注意,还有第二种接收状态数据的方法(称为 here_now()),我们将在下面进一步介绍。

<script>(function(){
    var pubnub = PUBNUB.init({
        subscribe_key : 'demo'
    });

    pubnub.subscribe({
        channel    : "hello_world",                        // YOUR CHANNEL.
        message    : function( message, env, channel ) {}, // RECEIVE MESSAGE.
        presence   : function( message, env, channel ) {   // PRESENCE EVENTS.
            console.log( "Channel: ",            channel           );
            console.log( "Join/Leave/Timeout: ", message.action    );
            console.log( "Occupancy: ",          message.occupancy );
            console.log( "User ID: ",            message.uuid      );
        }

    })
})();</script>

Ruby 中的示例源代码

这是 Ruby 代码,它是实时接收 Presence 事件发生时的 ruby​​ 方法。您可以在事件进入时处理事件流或(Firehose)。请注意,还有第二种接收状态数据的方法(称为 here_now()),我们将在下面进一步介绍。

require 'pubnub'

pubnub = Pubnub.new(
    :publish_key   => 'demo', # publish_key only required if publishing.
    :subscribe_key => 'demo', # required
    :secret_key    => nil,    # optional, if used, message signing is enabled
    :cipher_key    => nil,    # optional, if used, encryption is enabled
    :ssl           => nil     # true or default is false
)

## Receive Presence Events on a Channel
pubnub.presence(
    :channel  => :hello_world,
    :callback => lambda { |event_data| puts(event_data) }
)

当事件发生(例如用户加入)时,输出数据将如下所示:

{"action":"join", "timestamp":1364261400, "uuid":"9d497a30-3af2-4b67-a6b3-82f254711c11", "occupancy":4}

在用户断开连接时,存在事件被触发为:

{"action":"leave", "timestamp":1364251540, "uuid":"9d497a30-3af2-4b67-a6b3-82f254711c11", "occupancy":3}

并且可能在发生错误/超时的情况下:

{"action":"timeout", "timestamp":1364251540, "uuid":"9d497a30-3af2-4b67-a6b3-82f254711c11", "occupancy":3}

JavaScript 中的 Here_Now

有一个here_now()功能可供您使用,允许您向 PubNub 网络发出单个 REST 请求,以获取通道连接的当前状态。请求如下所示:

<script>(function(){
    var pubnub = PUBNUB.init({
        subscribe_key : 'demo'
    });

    pubnub.here_now({
        channel  : 'hello_world',
        callback : function (message) { console.log(message) }
    });
})();</script>

响应对象将如下所示:

{"uuids":["754e58b3-a79b-4d91-8f6c-5d994e43a310","175c2c67-b2a9-470d-8f4b-1db94f90e39e","fafd273d-9be5-4049-a6ce-653c467f7c5d"],"occupancy":3}

Ruby 中的 Here_Now

就像在 JavaScript 中一样here_now(),Ruby 中也可以使用相同的函数。这是 ruby​​ 语法版本:

require 'pubnub'

pubnub = Pubnub.new(
    :publish_key   => 'demo', # publish_key only required if publishing.
    :subscribe_key => 'demo', # required
    :secret_key    => nil,    # optional, if used, message signing is enabled
    :cipher_key    => nil,    # optional, if used, encryption is enabled
    :ssl           => nil     # true or default is false
)

pubnub.here_now(
    :channel  => :hello_world,
    :callback => lambda { |event_data| puts(event_data) }
)

响应对象数据与 JavaScript 中可用的数据相同。

{"uuids":["754e58b3-a79b-4d91-8f6c-5d994e43a310","175c2c67-b2a9-470d-8f4b-1db94f90e39e","fafd273d-9be5-4049-a6ce-653c467f7c5d"],"occupancy":3}

最后,如果您想使用 PubNub Network 提供的简单 JSON REST 接口,您可以轻松发出以下请求:

curl http://pubsub.pubnub.com/v2/presence/sub_key/demo/channel/hello_world

并且响应输出是相同的:

{"uuids":["754e58b3-a79b-4d91-8f6c-5d994e43a310","175c2c67-b2a9-470d-8f4b-1db94f90e39e","fafd273d-9be5-4049-a6ce-653c467f7c5d"],"occupancy":3}

就是这样!超级简单易用的 PubNub Network Presence 与 Ruby on Rails 和 JavaScript。如果您有任何问题,请直接联系 PubNub,也可以访问以下链接了解更多详情:

于 2013-03-23T01:51:25.063 回答