node.jsのsocket.ioのRubyクライアントライブラリ作った。

rubygems.orgに既に他に2つ実装があるものの、1つは古く、もう一つはruby2.0で動かずプロジェクトが生きてない感じだったので、車輪再発明した。

socket.ioはwebsocketとかajax pollingとかflashとかiframeとかいろいろ使うけど、rubyなのでwebsocketしか実装しないことにした。

昨日のmix-inした関数を上書き定義前にalias_methodで退避するで、event_emitterとwebsocket-client-simpleにほとんど任せてるのでそんなに面倒でもなかった。70行ぐらいで実装できた。


インストール

gem install socket.io-client-simple


ソースコード

https://github.com/shokai/ruby-socket.io-client-simple

不具合などあったら@shokaiかgithubのissueにお願いします


使い方


接続
samples/sample.rb
require 'rubygems'
require 'socket.io-client-simple'

socket = SocketIO::Client::Simple.connect 'http://localhost:3000'

socket.on :connect do ## 接続イベント
puts "connect!!!"
end

socket.on :disconnect do ## 切断イベント
puts "disconnected!!"
end

## サーバーからイベント"chat"がemitされたら、このコールバックが呼ばれる
socket.on :chat do |data|
puts "> " + data['msg']
end

puts "please input and press Enter key"
loop do
msg = STDIN.gets.strip
next if msg.empty?

## サーバーにchatイベントを送る
socket.emit :chat, {:msg => msg, :at => Time.now}
end


サーバー側の実装は普通にsocket.ioのリファレンス実装みたいな感じ。

samples/chat_server.js
// socket.io chat server

var io = require('socket.io').listen(3000);

io.sockets.on('connection', function(socket){
socket.emit('chat', {msg: 'hello world (from server)'});
socket.on('chat', function(data){
console.log(data);
socket.emit('chat', data); // echo
});
});


まだ切断したら自動再接続する機能ないけど、すぐ実装する予定。