前に書いたsinatra/streamingでcometするやつを使いやすいようにgemにして、sinatra-cometioというsinatraのpluginを作った。
https://github.com/shokai/sinatra-cometio
thin等のEventMachine上のサーバーで動く。Apache+Passenger等では動かない。
チャットを作った例 http://cometio-chat.herokuapp.com
インストール
gem install sinatra-cometio
なかなか簡単に使えるようになっている。socket.ioを参考にした。
サーバー側
onのイベント名でクライアント側からのアレを受け取って、クライアント側のイベント名を指定して送り返す
require 'sinatra'
require 'sinatra/cometio'
## echo
CometIO.on :chat do |data|
puts "#{data.name} : #{data.message}"
self.push :chat, data # server --> client
end
require ‘sinatra-cometio’すると /cometio 以下にcomet用のrouteやjsファイルが生成されるようになっている。
クライアント側
jQueryが必要。
cometio.jsを読み込むんだけど、cometio.jsのURLはcometio_jsというヘルパー関数が返してくれる
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="<%= cometio_js %>"></script>
on(イベント名, callback)でサーバーから来たデータを受け取る。push(イベント名, データ)でサーバーに送る。
var io = new CometIO().connect();
// client <-- server
io.on("chat", function(data){
consle.log(data.name+" : "+data.message);
});
// client --> server
io.push("chat", {name: "shokai", message: "hello"}); // 送信ボタン押したイベントとかから呼び出す
ちゃんと測ってないけど500ぐらいぶら下がってしばらくすると接続エラーが出始めた。300ぐらいなら問題ない。
大してメモリも食わないのでforkしておけばいいのではないか
まだsessionがないので、つないでいるクライアント全員に送るしかない、なんとかする