`
siuying
  • 浏览: 91612 次
  • 性别: Icon_minigender_1
  • 来自: 香港
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用 Rails 和 Juggernaut 作即時通訊

    博客分类:
  • Tech
阅读更多

AJAX
在 AJAX 出現前,傳統網上軟件的用戶首先要學習的是等待。直到2005 年,Google Suggest 和 Google Map 等網上軟件出現,它們利用 XMLHttpRequest 和 Java Script ,讓網上軟件可以不用重新載入版面就能更新資料。這種即時回應大大改善了網上軟件的用戶體驗,JJG 把這種技術稱之為 AJAX 1。自此 Wep App 終於可以跟傳統軟件較量,AJAX 被認為是 Web 2.0 背後最重要的技術。

Comet
然而仍有一個問題要解決。AJAX 和傳統的網上軟件一樣只能單向地回應使用者的動作。除了由用者主動 polling 外,基本上軟件不能把消息發給用戶。講求群眾互動的 Web 2.0 竟不能作即時通訊,這種限制讓很多軟件也未能發展。2006 年,GTalk 和 Meebo 出現,它們利用持續的 HTTP connection,只用 HTTP 協定就能做到即時通訊的效果,Alex Russell 把這類技術稱之為 Comet 2 — 這不是任何字的簡寫,泛指事件導向、伺服器端 Push 資料的軟件。

Compare AJAX and Comet web model, originally from Comet: Low Latency Data for the Browser
Comet

Ruby on Rails 和 Web 2.0
Ruby on Rails 本身整合了 PrototypeScript.aculo.us ,開發者可以只用 Ruby on Rails 就寫出純正的 AJAX 軟件。相對來說 Comet 的工具在 Rails 上還未成熟,其中最容易的可算是 Juggernaut 。 Juggernaut 會在版面中加入 Flash 的 Juggernaut client ,它會跟 Juggernaut 的 Push Server 保持一個持續的 XMLSocket 連接,以接收 server 傳來的 javascript,用以更新 client 畫面。以下我會示範怎樣用 Juggernaut 做一個 Push 的網站。

系統要求

  1. Rails 1.1 或以上
  2. json gem (gem install json)
  3. eventmachine gem (gem install eventmachine 或 gem install eventmachine-win32)

使用方法

  1. 開啟一個新 project,安裝 juggernaut:

    rails Realtime
    cd Realtime
    script/plugin install svn://rubyforge.org//var/svn/juggernaut/trunk/juggernaut

  2. 新增一個 layout "apps/view/layout/application.rhtml" ,javascript_include_tag :defaults 一句是基本的 Rails helper , 在安裝 juggernaut 後會自動包括 juggernaut 的 javascript 檔。
    <html>
      <head>
        <%= javascript_include_tag :defaults %>
      </head>
      <body>
        <%= yield %>
      </body>
    </html>
  3. 新增一個 controller "main":
    ./script/generate controller main index
  4. 按需要修改設定檔 "config/juggernaut.yml",暫時我們不用改任何東西。
  5. 新增一個 view "app/views/main/index.rhtml",form_remote_tag 是基本的 Rails AJAX function,它把 HTML FORM 的動作用 AJAX 送去 Server。listen_to_juggernaut_channels() 讓 client 在載入頁面後連接去指定 channel 接收 push 資料。

    <h1>Push Demo</h1>

    <%= listen_to_juggernaut_channels(['channel']) %>

    <%= form_remote_tag :url => {:action => :push} %>
    <%= submit_tag 'Push!' %>
    <%= end_form_tag %>

  6. 修改 "app/controllers/main_controller.rb",加入 push method。Juggernaut.send_data() 方法會向所有已連接的 Client 收到訊息
    class MainController < ApplicationController
      def index
      end
    
      def push
        Juggernaut.send_data("alert('Hello, world!')", ['channel'])
      end
    end
  7. 是時候測試一下成果!分別啟動 Rails 和啟動啟動 Juggernaut Push Server:

    ruby ./script/push_server
    Starting Juggernaut Push Server
    Port: 15000
    Host: 0.0.0.0

    ./script/server
    => Booting Mongrel (use 'script/server webrick' to force WEBrick)
    => Rails application starting on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    ** Starting Mongrel listening at 0.0.0.0:3000
    ** Starting Rails with development environment…
    ** Rails loaded.

  8. 試著同時開啟兩個 browser 到 http://localhost:3000/,按下其中一頁的 "Push" 按鈕,兩個 browser 會同時彈出一個 javascript 的 alert message!
    Push alert message!
  9. 以上例子中,由 client 到 server 的訊息由 AJAX 發送,由server 到 client 的訊息由 Juggernaut 發送,這樣我們就有一個能雙向、即時通訊的軟件 model,至於怎樣利用這種強大的力量就要由開發者去想了!
  10. 當然 Juggernaut 還有其他功能,如對單一用戶發訊、動態加入和離開 channel 、用戶認證、以及在用戶開啟和關閉 Browser 時啟動 trigger action 。詳情可以參看 Nicolas Cavigliano 不斷更新的教學。 當然也可以讀 Juggernaut 的源碼 ,特別是 library "vendor/plugins/juggernaut/lib/juggernaut.rb" 和 Push Server "vendor/plugins/juggernaut/media/push_serve"
  11. 以上例子的源碼可以在此下載

研究 Juggernaut 時遇到的問題

  1. Flash 對 XMLSocket Connection 有許多限制。Juggernaut 的作者建議把 Push Server 放在 443 port ,讓軟件可以穿過 firewall。然而不知為何我的電腦上無論 Firefox 還是 Safari Flash 也不肯連去 443 port …
  2. 要注意 juggernaut.yml 的 HOST 和 URL ,如果你設定的是 localhost ,在 browser 中輸入 127.0.0.1 是絕對不會成功的!這是 Flash 的防止 cross site socket 機制。
  3. Client 和 Push Server 使用 Socket 連結, Rails 跟 Push Server 同樣使用 Socket:所有 Juggernaut 的 function 其實都會叫 Rails 開一個 Socket 連去 Push Server。每次發訊也要一個 Socket 在大型應用似乎不是一個好的想法 。

其他方案
Apache ActiveMQ 的 AJAX Polling 方案,似乎可以做到類似 Pushing 的效果,有待研究。

延申閱讀


  1. Ajax: A New Approach to Web Applications
  2. Comet: Low Latency Data for the Browser
分享到:
评论

相关推荐

    Ruby-GoOnRails使用Rails生成器来生成一个Golang应用

    Ruby on Rails(简称Rails)是一种流行的Web开发框架,以其“约定优于配置”的理念和高效的开发速度受到开发者喜爱。而Go(Golang)则是一种静态类型、编译型的语言,以其高性能、简洁的语法和强大的并发能力闻名。...

    使用Aptana+Rails开发Rails Web应用(中文)

    为了运行和测试应用,你需要在命令行中使用Rails服务器。在Aptana中,可以使用内置的终端工具。打开“Terminal”视图,输入`rails server`启动服务器,然后在浏览器中访问`http://localhost:3000`查看你的应用。 在...

    Rails项目源代码

    这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何利用Rails的强大功能来创建一个允许用户上传、分享和浏览图片的应用。 1. **Rails框架基础**: Rails的核心理念是DRY(Don't...

    Rails 101 入门电子书

    - 安装Rails: 使用gem工具安装最新的Rails版本。 - 测试安装: 创建一个简单的Rails应用来验证是否成功安装。 #### 五、练习作业0-Hello World - **目标**: - 学习如何创建第一个Rails应用程序。 - **过程**: -...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    rails2-sample

    这一章节将教授如何使用Rails的测试框架进行单元测试、集成测试和功能测试。同时,也会介绍如何对应用进行基准测试,评估其性能表现。 #### 12. Deployment and Production Use(部署和生产使用) 最后,本书将...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    rails敏捷开发的购物车系统

    这可以通过使用Rails的身份验证机制,如Devise或Authlogic,实现用户登录和会话管理。 最后,测试是任何Rails应用不可或缺的一部分。使用RSpec进行行为驱动开发(BDD)测试,Rake任务自动化测试执行,确保购物车...

    rails2.3.2gem本地安装包及使用说明

    Rails 2.3.2 是一个古老的 Ruby on Rails 框架版本,它在 Ruby 社区中曾经广泛使用。Gem 是 Ruby 的包管理器,用于安装和管理各种库和框架,包括 Rails。如果你无法通过网络升级或安装 Rails,可以采用本地安装包的...

    jquery-rails, 一个 gem,用于自动使用jQuery和 Rails 3.zip

    jquery-rails, 一个 gem,用于自动使用jQuery和 Rails 3 railsjQuery 面向 Rails 如此伟大。这里 gem 提供:jQuery 1.7.2jQuery UI 1.8.18 ( 仅适用于 javascript )jQuery UJS适配器assert_select_j

    Rails

    综合以上信息,学习和掌握Rails需要理解其核心组件和设计理念,熟练使用相关工具,阅读源码以加深对框架运作的理解,并通过实践项目来巩固理论知识。Rails是一个强大且高效的Web开发框架,它简化了许多常见的开发...

    Ruby on Rails教程:学习使用Rails进行Web开发Ruby on Rails Tutorial: Learn Web Development with Rails

    本书教您如何使用Ruby on Rails开发和部署真正的,具有工业实力的Web应用程序,Ruby on Rails是为诸如Twitter,Hulu,GitHub和Yellow Pages等顶级网站提供支持的开源Web框架。

    Rails3 使用rake启动后台任务

    以下是一些关于如何在 Rails3 中使用 rake 启动后台任务的知识点: 1. **Rakefile**: 每个 Rails 项目都有一个 Rakefile 文件,这是 Rake 执行任务的入口点。在这个文件中,你可以定义自定义的任务。 2. **Task ...

    rails指南 中文版

    5. **Gemfile与Bundler**:Rails项目通常使用Gemfile来管理依赖库,Bundler工具则用于安装和管理这些依赖,确保在不同环境下项目的运行一致性。 6. **Scaffolding**:Rails提供了快速生成基本CRUD(Create, Read, ...

    rails-settings, 使用 Ruby on Rails 管理设置.zip

    rails-settings, 使用 Ruby on Rails 管理设置 Rails的设置 ruby gem,通过在单独的数据库表中将它们存储为序列化的哈希来处理。 包含命名空间和默认值。要求ruby 1.9.3或者更高版本Rails 3.1或者更高版本( 包括 ...

    rails本地安装包完整版

    1. **activesupport-2.1.0.gem**:ActiveSupport是Rails的一个重要库,提供了许多实用的工具和方法,如时间区处理、字符串格式化、数组和哈希操作等。它也包含了一些核心的Ruby扩展,帮助开发者编写更简洁、更具表达...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **步骤**:通过命令行使用`rails new project_name`来初始化一个新的Rails项目。 - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 ...

Global site tag (gtag.js) - Google Analytics