Comet + Rails がおもしろい!


今更ながらCometに挑戦。
Cometというのは…

Comet(コメット)とは、Webアプリケーションを構築する際に利用される技術で、この技術を使うと、サーバで発生したイベントをクライアントからの要請なしにクライアントに送信することができる。
Comet - Wikipedia

ニコニコ動画などのように、こっちからのリクエストがなくてもサーバからメッセージが飛んでくるあれです。


そのCometをRailsで挑戦。
ちょっと遊んでみたけど面白い!
思ったより簡単だったので、メモ。


まずは、環境構築。
今回はgem"Juggernaut"を使用します。
Juggernaut http://juggernaut.rubyforge.org/

前提条件

gemインストール

以下3つのgemをインストールします

  • json
  • eventmachine
  • juggernaut
>gem install json
Successfully installed json-1.1.6-x86-mswin32
1 gem installed
Installing ri documentation for json-1.1.6-x86-mswin32...

No definition for cState_configure

No definition for cState_configure
Installing RDoc documentation for json-1.1.6-x86-mswin32...

No definition for cState_configure

No definition for cState_configure


>gem install eventmachine
Successfully installed eventmachine-0.12.6-x86-mswin32-60
1 gem installed
Installing ri documentation for eventmachine-0.12.6-x86-mswin32-60...
Installing RDoc documentation for eventmachine-0.12.6-x86-mswin32-60...


>gem install juggernaut
Successfully installed juggernaut-0.5.7
1 gem installed
Installing ri documentation for juggernaut-0.5.7...
Installing RDoc documentation for juggernaut-0.5.7...

Railsプロジェクト作成

>rails comet_test
>cd comet_test


plugin "juggernaut_plugin" をインスコ

>ruby script/plugin install git://github.com/maccman/juggernaut_plugin.git
Initialized empty Git repository in c:/rbc/comet_test/vendor/plugins/juggernaut_plugin/.git/
remote: Counting objects: 28, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 28 (delta 3), reused 12 (delta 0)
Unpacking objects: 100% (28/28), done.
From git://github.com/maccman/juggernaut_plugin
 * branch            HEAD       -> FETCH_HEAD
Installing Juggernaut...
Juggernaut has been successfully installed.

Please refer to the readme file c:/rbc/comet_test/vendor/plugins/juggernaut_plugin/README


コントローラ作成

>ruby script/generate controller comet index connect
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/comet
      exists  test/functional/
      create  test/unit/helpers/
      create  app/controllers/comet_controller.rb
      create  test/functional/comet_controller_test.rb
      create  app/helpers/comet_helper.rb
      create  test/unit/helpers/comet_helper_test.rb
      create  app/views/comet/index.html.erb
      create  app/views/comet/connect.html.erb


コントローラ修正
APP_ROOT\app\controllers\comet_controller
太線部を追記

class CometController < ApplicationController
  def index
  end

  def connect
    Juggernaut.send_to_all("alert('hi from juggernaut')")
  end

end


ビュー作成
APP_ROOT\app\views\comet\index.html.erb
こんな感じで書いていきます

<html>
  <head>
    <%= javascript_include_tag :defaults, :juggernaut %>
  </head>
  <body>
    <%= juggernaut %>
  </body>
</html>

サーバ起動

まずはcometサーバの起動

>juggernaut -g config\juggernaut.yml
Generating config file....
Config file generated at c:/rbc/comet_test/config/juggernaut.yml


>juggernaut -c config\juggernaut.yml
Starting Juggernaut server on port: 5001...


つづいてRailsサーバ起動

>ruby script/server
=> Booting Mongrel
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server

確認

複数のブラウザ(FireFoxIEGoogle Cromeなど)を起動して以下のURLを入力
http://localhost:3000/comet


その状態で別のブラウザを起動して以下のURLを入力
http://localhost:3000/comet/connect


既に開いている画面でこんなカンジのアラートが表示されたらオッケー

解説は気が向いたら


参考