Sinatra RocketIOのRubyクライアントを作った。
Thread版とEventMachine版がある。
コレを使うとサーバーにwebブラウザ以外からデータを投入したり取得したりできて便利。
ワーカーに作業を任せるのにも使えなくもないかも。


Thread版

sinatra-rocketio gemに付属してる。

Sinatra::RocketIO::Client · shokai/sinatra-rocketio Wiki


例えばhttp://rocketio-chat.herokuapp.com/のCUIクライアントを作る例

#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra/rocketio/client'

io = Sinatra::RocketIO::Client.new('http://rocketio-chat.herokuapp.com').connect

io.on :connect do |session|
puts "#{io.type} connect!! (session_id:#{session})"
end

io.on :chat do |data|
puts "<#{data['name']}> #{data['message']}"
end

io.on :error do |err|
STDERR.puts err
end

io.on :disconnect do
puts "disconnected!!"
end

loop do
line = STDIN.gets.strip
next if line.empty?
io.push :chat, {:message => line, :name => name}
end
Threadなので、最後にloopで止めないとRubyが終了する。


デフォルトでwebsocketを先に試すので、最初からcometを使いたいのならtypeオプションを渡す。
io = Sinatra::RocketIO::Client.new('http://rocketio-chat.herokuapp.com', :type => :comet).connect


仕様

コンストラクタにアプリのURLを渡すと、 /rocketio/settingsというJSONを読みにいってそのアプリでcometとwebsocketが使えるか確認する(RocketIOは設定でcometのみとかできる)

settingsの読み込みに失敗すると10秒ぐらい待ってからまた見に行く。

websocketとcometが両方使えるなら、websocketから接続を試す。接続できなかったらcometを使う。

cometにはHTTParty、websocketにはwebsocket-client-simpleを使っている。
どちらも切断されても自動的に再接続しにいく。


EventMachine版


EM::RocketIO::Client · shokai/sinatra-rocketio Wiki
shokai/em-rocketio-client · GitHub

eventmachine版の方が高速に動作する。
通信にem-http-clientとem-websocket-clientを使っているが、thread版と動作は同じ。


インストール
gem install em-rocketio-client


同様にチャットクライアントを作ってみる

require 'rubygems'
require 'eventmachine'
require 'em-rocketio-client'

url = 'http://rocketio-chat.herokuapp.com'
EM::run do
io = EM::RocketIO::Client.new(url).connect

io.on :* do |event_name, data|
puts "(#{io.type}) #{event_name} - #{data.inspect}"
end

EM::defer do
loop do
line = STDIN.gets.strip
next if line.empty?
io.push :chat, {:message => line, :name => name}
end
end
end

*で全イベントを取得できる。


こっちは下の2つのgemを合体させて実装している。
shokai/em-cometio-client · GitHub
shokai/em-websocketio-client · GitHub