読者です 読者をやめる 読者になる 読者になる

WebSocketサーバライブラリ rev-websocket リリース

いま WebSocket がにわかに注目を集めているようです。
ブラウザとサーバの間でリアルタイムな双方向通信を実現する機能で、HTML5に追加された(される予定の)新しい仕様です。
このWebSocketを使うには、ブラウザ側のJavaScriptの記述だけでなく、サーバ側の実装も必要になります。


そこで、Rubyで使えるWebSocketのサーバライブラリ rev-websocket をリリースしました。
gemでインストールできます:gem install rev-websocket


早速、デモアプリケーションを作ってみました:シャウッたー *1
http://visys.podzone.net:8080/


WebSocket を使ったチャットシステムに、ちょっとした演出を加えたシンプルなアプリケーションです。速くタイプするほど大きく表示されるという趣向です^^;
WebSocket に対応しているブラウザは今のところ SafariChromeFirefox 4 beta 1 ですが、他のブラウザでも Flash と JavaScript でエミュレーションしてくれるライブラリを使って動作します。感謝。(web_socket.js - HTML5のWeb SocketをFlashを使って実装


WebSocketはサーバとブラウザの間でコネクションを張りっぱなしにするため、いわゆるC10K問題に対処する必要があります。
rev-websocketは、高速なイベント駆動I/Oライブラリの Rev をベースにしており、大量のクライアントを効率よく扱うことができます。(参考:並列1000コネクションに耐える! Ruby のイベント駆動ライブラリ Rev と EventMachine の HTTPクライアント
プロトコルの処理には、Thin でも利用されている高速なプロトコルパーサを採用しています。
WebSocket はまだまだ仕様が安定していませんが、rev-websocketはドラフト75とドラフト76の両方に対応しています。


サーバ側のコードは↓こんな感じになります:

require 'rubygems'
require 'rev/websocket'    # gem install rev-websocket

# Rev::WebSocketを継承したクラスを作成
class MyConnection < Rev::WebSocket
  # 接続されたら呼ばれる
  def on_open
    puts "WebSocket opened"
    send_message("Hello, world!")  # メッセージを送る
  end

  # メッセージが届いたら呼ばれる
  def on_message(data)
    puts "WebSocket data received: '#{data}'"
    send_message("echo: #{data}")
  end

  # 切断されたら呼ばれる
  def on_close
    puts "WebSocket closed"
  end
end

server = Rev::WebSocketServer.new('0.0.0.0', 8080, MyConnection)
server.attach(Rev::Loop.default)

Rev::Loop.default.run


クライアント側のコードは、普通のWebSocketのプログラムと同じです。
ソースコードの中にある各種examplesや、シャウッたーのソースを覗いてみてください^^;

*1:期間限定公開です。そのうちに無くなります。。。