WebSocketがつなぐ未来のお話

俺の話を聞け!

WebSocketがつなぐ未来のお話

自己紹介

最近はクライントサイド(HTML5・Javascript)の勉強をしてます。

WebSocketについてお話しします

たいそうに未来とか書いてますが・・・
タイトルはぶっちゃけ釣りです(´・ω・`)

アジェンダ

WebSocketって何?

Ajaxと変わらないんじゃないの?

Ajax技術は基本的にクライアントからサーバにリクエストを送ることで通信するので、
サーバのタイミングでレスポンスを返すことが難しい。

WebSocketは双方向通信を前提にしており、一度コネクションを張れば
以後同じ接続を利用するので、Ajax技術と比較して通信効率がいい

HTTPプロトコルイメージ

Ajax(httpリクエスト)は都度コネクションを貼り、レスポンスを待つ
httpプロトコル

WebSocketプロトコルイメージ

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

Ajaxのように都度コネクションを貼る必要が無くなるので、結果通信ロスが減る

どうやって使うの?

  1. 一度httpプロトコル(要は普通にブラウザ)で画面表示
  2. javascriptからwsオブジェクトをURL指定で生成
  3. httpの場合の接続先:『ws://exsample.com』
  4. httpsの場合の接続先:『wss://exsample.com』
  5. これだけでクライアント⇔サーバの双方向通信が可能になります

クライアント実装

接続自体は非常に簡単

<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をサーバ側がクライアントごとに名前をつけてコレクションして、
クライアント側から受けたメッセージをすべてのクライアントに流せばチャットなんかが作れます。

chat

WebSocketを使ったチャットデモ

http://prog.re-d.net/demo/websocket/chat/

中の人はどうすればいいの?

WebSocketに対応できるサーバが必要

JAVA
Jetty7
Python
Apache + mod_pywebsocket
JavaScript(ServerSide!)
node.js

使う人はどうすればいいの?

WebSocketが使えるブラウザで見なきゃいけない

じゃ、どのブラウザが対応しているの?

WebSocket対応ブラウザ

ブラウザ対応
おやおや?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/

まとめ

多謝!

今回、中西 祐介さん(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/

ご清聴ありがとうございました

〜 お疲れ様でした 〜