3月 192013
<< RocketIOの全イベント取得方法 || Ubuntu/Debianでarduino_firmata動くようになった >>
nodeのSocket.ioっぽい物のRuby版を作った。
https://github.com/shokai/sinatra-rocketio
依存
EventMachineが有効なWebサーバー︵thinとか︶と、jQueryが必要。 Rubyは1.8.7〜2.0.0まで動く。Sinatraで使う
インストールgem install sinatra-rocketioブラウザとか回線に応じてWebSocketとCometの使える方が自動的に選ばれる。 切断されても定期的に再接続を試みるようになってる。 sinatraに読みこむだけで使える。sinatraのプロセス内にwebsocketサーバーも組み込まれる。
require 'sinatra'modular styleではclass内でregisterすればok
require 'sinatra/rocketio'
class MyApp < Sinatra::Base
register Sinatra::RocketIO
## 略
end
サーバーからブラウザにpushするの簡単にできる
Sinatra側io = Sinatra::RocketIOpushはsinatraのgetとかpostの中に書いてもいい。どこに書いてもpushできる。 クライアント側。JSライブラリを読み込む。
io.push :temperature, 35 # 全てのクライアントに送信
io.push :light, {:value => 150}, {:to => session_id} # 特定のクライアントへ
<script src="<%= rocketio_js %>"></script>hamlの場合はこう
%script{:src => rocketio_js}そしてJavaScriptに受信イベント書く
var io = new RocketIO().connect(); // WebSocketとCometの適当な方が使われる通信というより、クライアント側でイベント登録しておいてサーバーから呼び出せる感じ。
io.on("temperature", function(value){
console.log("温度 : " + value);
}); // => "温度 : 35"
io.on("light", function(data){
console.log("明るさ : " + data.value);
}); // => "明るさ : 150"
クライアントからサーバーへ送信
JS側io.on("connect", function(){Ruby側
io.push("chat", {name: "shokai", message: "hello"});
});
io.on :chat do |data, client|逆も同じ要領でできる。”chat”というイベントを登録しておいて受信してみた。 チャットなので全クライアントに返送もする。 サーバーは、クライアントのセッションIDとtype(websocketかcometか)も取れる。
puts "#{data['name']} : #{data['message']} <#{client.session}> type:#{client.type}"
io.push :chat, data # 全クライアントに返送
end