WebSocketサーバライブラリ rev-websocket リリース
いま WebSocket がにわかに注目を集めているようです。
ブラウザとサーバの間でリアルタイムな双方向通信を実現する機能で、HTML5に追加された(される予定の)新しい仕様です。
このWebSocketを使うには、ブラウザ側のJavaScriptの記述だけでなく、サーバ側の実装も必要になります。
そこで、Rubyで使えるWebSocketのサーバライブラリ rev-websocket をリリースしました。
gemでインストールできます:gem install rev-websocket
早速、デモアプリケーションを作ってみました:シャウッたー *1
WebSocket を使ったチャットシステムに、ちょっとした演出を加えたシンプルなアプリケーションです。速くタイプするほど大きく表示されるという趣向です^^;
WebSocket に対応しているブラウザは今のところ Safari と Chrome、Firefox 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:期間限定公開です。そのうちに無くなります。。。