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 rubyThreadなので、最後にloopで止めないと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
デフォルトで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