如何在Ruby中实现Pubnub Presence功能

时间:2013-03-22 16:28:45

标签: pubnub user-presence

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

1 个答案:

答案 0 :(得分:4)

使用Ruby和JavaScript的PubNub Presence

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

PubNub Presence Introduction

PubNub Presence允许您提出问题“谁在那里?”,并以用户ID列表的形式收到回复,占用人数为谁目前在线。

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

PubNub Presence SDK

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

安装PubNub Ruby GEM

sudo gem install pubnub

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

包括PubNub JavaScript Client SDK

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

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

PubNub开发者控制台 - 存在

  

使用PubNub Developer's Console监控在场事件。

您可以使用PubNub Developer's Console在发生事件时观察它们。您将能够在存在部分中以JSON形式查看事件有效负载,如下图所示:

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

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

PubNub Presence with REST

PubNub Here Now

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

使用SDK的PubNub Presence

JavaScript中的示例源代码

以下是JavaScript中用于在频道上接收数据的方法的示例,并且还实时接收该频道的在线事件。您还会注意到函数回调中传递给您的参数。此方法允许您将数据流接收到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 Code,它是在发生时实时接收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}

Here_Now in JavaScript

您可以使用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}

Here_Now in Ruby

就像在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网络提供的简单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}

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