俺の話を聞け!
WebSocketがつなぐ未来のお話
自己紹介
- かみやん (Twitter@kamiyam)
- システム開発会社
- ほとんどWebのシステム
- Java・C#
最近はクライントサイド(HTML5・Javascript)の勉強をしてます。
WebSocketについてお話しします
たいそうに未来とか書いてますが・・・
タイトルはぶっちゃけ釣りです(´・ω・`)
アジェンダ
- WebSocketって何?
- WebSocketを使ったデモ
- ところで・・・
- まとめ
WebSocketって何?
- クライアント⇔サーバ間をつなぐ新しいプロトコルの1つです
- WebSocketの頭文字『ws://~』 or 『wss://~』
- 元々はHTML5の仕様の一部だった
- 現在は単独のプロトコル規格として策定中(プロトコルバージョンは76)
- WebSocketはサーバからもクライアントからも通信を行える完全双方向通信
Ajaxと変わらないんじゃないの?
Ajax技術は基本的にクライアントからサーバにリクエストを送ることで通信するので、
サーバのタイミングでレスポンスを返すことが難しい。
WebSocketは双方向通信を前提にしており、一度コネクションを張れば
以後同じ接続を利用するので、Ajax技術と比較して通信効率がいい
HTTPプロトコルイメージ
- Ajax(httpリクエスト)は都度コネクションを貼り、レスポンスを待つ

WebSocketプロトコルイメージ
- WebSocketは一度コネクションを貼ると、通信をそのwsコネクション上でやり取りする

Ajaxのように都度コネクションを貼る必要が無くなるので、結果通信ロスが減る
どうやって使うの?
- 一度httpプロトコル(要は普通にブラウザ)で画面表示
- javascriptからwsオブジェクトをURL指定で生成
- httpの場合の接続先:『ws://exsample.com』
- httpsの場合の接続先:『wss://exsample.com』
- これだけでクライアント⇔サーバの双方向通信が可能になります
クライアント実装
接続自体は非常に簡単
<script type="text/javascript">
var protocol = ( location.protocol == "https:" ) ? "wss" : "ws";
var url = protocol + "://" + "exsample.com";
var websocket = new WebSocket( url );
//WebSocketのイベントの登録
websocket.addEventListener( "open", openFunc, false );
websocket.addEventListener( "close", closeFunc, false );
websocket.addEventListener( "message", receiveMessage, false );
getElementById("button").addEventListener( "click", sendMessage, false );
function sendMessage()
{
websocket.send( "送信する文字列とかJsonとか" );
}
function receiveMessage( msg )
{
alert ( msg.data );
}
</script>
サーバサイド実装
javaのWebSocketインターフェース
クライアントのイベント処理に応じて"onHogeHoge"が呼ばれる
import java.io.IOException;
public interface WebSocket
{
public final byte LENGTH_FRAME = ( byte )0x80;
public final byte SENTINEL_FRAME = ( byte )0x00;
void onConnect( Outbound outbound );
void onMessage( byte opcode, String data );
void onFragment( boolean more, byte opcode,byte[] data, int offset, int length );
void onMessage( byte opcode, byte[] data, int offset, int length );
void onDisconnect();
public interface Outbound
{
void sendMessage( String data ) throws IOException;
void sendMessage( byte opcode, String data ) throws IOException;
void sendMessage( byte opcode, byte[] data, int offset, int length ) throws IOException;
void sendFragment( boolean more, byte opcode,byte[] data, int offset, int length ) throws IOException;
void disconnect();
boolean isOpen();
}
}
※jetty-websocket-7.2.0.v20101020.jarより
WebSocketを使った実装一例
(Jetty7では)Outboundをサーバ側がクライアントごとに名前をつけてコレクションして、
クライアント側から受けたメッセージをすべてのクライアントに流せばチャットなんかが作れます。

WebSocketを使ったチャットデモ
http://prog.re-d.net/demo/websocket/chat/
中の人はどうすればいいの?
WebSocketに対応できるサーバが必要
- JAVA
- Jetty7
- Python
- Apache + mod_pywebsocket
- JavaScript(ServerSide!)
- node.js
使う人はどうすればいいの?
WebSocketが使えるブラウザで見なきゃいけない
じゃ、どのブラウザが対応しているの?
WebSocket対応ブラウザ
- FireFox4(Beta7)
- Chrome4
- Opera 10.70
- Safari5(iOS4.2含む)

おやおや?IEが未対応なんですね・・・
IE9のWebSocket対応は・・・
見送られることが決定しています(※2010/12/11現在)
策定中のWebSocketの仕様にわざわざ対応させるメリットは少ないですから。
え?じゃ、WebSocketの未来って・・・?
WebSocketがつなぐことの出来るブラウザの実装って、実はまだまだ未来のお話なんじゃないの?
今、どう使う?
- クロスブラウザ
- FlashにWebsocketを連携させるライブラリがある
- gimite / web-socket-js - GitHub
- http://github.com/gimite/web-socket-js/tree/master
- IEでもWebSocketが使えるかも・・・!
- このあたり全然追えてないので、また今度・・・><
- スマートフォンアプリ
- iPhone / Android のネイティブアプリとしての可能性
- iPhone
- iOS4.2からSafariでWebsocketに対応
- Android
- webKitベースなので多分使える
WebSocketを使ったアプリ(例えば、大人数連携ゲームとか)
ところで・・・
かみやん、さっきからiPhone片手に何やってんの?
Twitterのリプライとか、そんなしょっちゅう来ないでしょ?
このスライド、実は・・・
WebSocketを使ってiPhoneから操作出来るんです。さらに同期スライド付き
iPhone + WebSocket + jQuery + mukiSlide.js
ちょっと実験してみましょうか?
iPhone + WebSocket + jQuery + mukiSlide.js
http://prog.re-d.net/demo/websocket/slide/
まとめ
- WebSocketは双方向通信プロトコル
- HTTPに比べ通信コストが軽量
- やっぱり、まだまだ策定段階
- この資料を書いている途中(9日)、Firefox4(Beta8)ではWebSocketの機能を一時的に無効化と発表したり
- リアルタイムWeb
多謝!
今回、中西 祐介さん(Twitter@hogenishi)のjQueryプラグイン”mukiSlide.js”を使わせていただきました。
ありがとうございます!
- Twitter@hogenishi
- http://twitter.com/#!/hogenishi
- http://yusukenakanishi.com/
- 初jQueryプラグイン!HTMLのスライド mukiSlide.js
- http://labs.yusukenakanishi.com/2010/03/13/mukislide/
- mukiSlideデモ
- http://factory.yusukenakanishi.com/javascript/jquery/plugin/mukislide/
ご清聴ありがとうございました
〜 お疲れ様でした 〜