大阪Node学園一時限目
Socket.IOとリアルタイムなナニか
自己紹介
- かみやん (Twitter@kamiyam)
- システム開発会社

- ほとんどWebのシステム
- Javaがメインのエンジニア
- 元自動車整備士です
Socket.IO
- Socket.IO » http://socket.io/
- 日本語訳: http://jxck.github.com/socket.io/ (via @jxck_
Socket.IOとは?
クロスブラウザ / クロスデバイス 上で リアルタイムアプリケーションを可能にする JavaScriptのライブラリである
リアルタイム アプリケーション?
リアルタイムってどういうことでしょう?
「リアルタイム」なモノをひとつ
「CTRL」 + 「0(ゼロ)」を押してみてください
自由にコメントして頂いてかまいません
Socket.IOはリアルタイムなものなのか?
- node.jsの衝撃とWebSocketが拓く未来
- http://www.atmarkit.co.jp/fcoding/articles/websocket/01/websocket01a.html
Node.js(と、Socket.IO)を調べているとよく"WebSocket"という単語をよく目にします。
WebSocketとは?
”素”(?)のWebSocketの仕様を追ってみたいと思います
- 「RFC 6455 - The WebSocket Protocol」
- http://tools.ietf.org/html/rfc6455
Webサーバとブラウザ/デバイスが双方向通信を実現するための規約
"Webサーバとブラウザ/デバイスとの双方向通信"
HTTPプロトコルイメージ
- Ajax(httpリクエスト)は都度コネクションを貼り、レスポンスを待つ

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

都度コネクションを貼る必要が無くなるので、結果通信ロスが減る。また、一回の通信データ量も少ない
WebSocket沿線
- 当初はHTML5に含まれるAPI/規約であったが、今は独立した規約となっている
-
- 2010年5月、最初の仕様案が提出される (Draft Standard)
- 2011年12月、紆余曲折を経てようやく仕様が確定 (Proposed Standard)
- Web標準(Internet Standard) になる日も近い?
WebSocketが使えるブラウザ/デバイス
- WebSockets - MDN
- https://developer.mozilla.org/en/WebSockets
WebSocketはすべてのブラウザ / デバイスで使えるわけではない
WebSocket非実装ブラウザへの対応
WebSocketに対応しないブラウザ(主にIE)へはどのように対応しているか?
Socket.IOのクロスブラウザ / デバイス対応
- Supported transports
- http://socket.io/#browser-support
-
- WebSocket
- Adobe® Flash® Socket
- AJAX long polling
- AJAX multipart streaming
- Forever Iframe
- JSONP Polling
Comet (AJAX long polling)
Cometはそれほど新しい技術ではない
- Cometを使ったアプリケーション
- Google Docs
- Google Wave
Socket.IO最大の特徴
WebSocketを主体としたハイブリッドなリアルタイム通信
Socket.IOの利点
- クライアント・サーバ側ともSocket.IOの独自APIで使える
- Proposed Standardになったとはいえ、まだまだ過渡期にあるWebSocketの仕様を深く追わなくてもよい.
Socket.IOブラウザ対応 (デスクトップ)
- Internet Explorer 5.5+
- Safari 3+
- Google Chrome 4+
- Firefox 3+
- Opera 10.61+
Socket.IOブラウザ対応 (モバイル)
- iPhone Safari
- iPad Safari
- Android WebKit
- WebOs WebKit
アンケート 1
Socket.io使ったことがありますか?
Socket.IOピックアップ
v0.7で大きな変更が加えられた
- Socket.IO v0.7からの変更点(抜粋)
- 名前空間
- 揮発性メッセージ
- 送信確認コールバック処理
- etc...
Socket.IOで抑えておきたいポイント
- コネクション接続時処理
- メッセージ送信 - emit("event")
- メッセージ受信 - on("event")
- 名前空間 - of/for('/name_space')
- 揮発性メッセージ - socket.volatile.emit
- 送信確認コールバック処理 emit callback
コネクション接続時処理
var io = require('socket.io').listen(80);
io.sockets.on('connection', function ( socket ) { //コネクション接続時のイベント
// コネクション接続時の処理を記述
socket.emit('welcome', { hello: 'world' }); //クライアントに返す
socket.on('disconnect', function () { // コネクション切断時のイベント
// コネクション切断時の処理を記述
io.sockets.emit( 'user disconnected' );
});
});
メッセージ送信 - emit("event_name")
以前は「send()/broadcast()」などがあった
// 自分自身へ送る
socket.emit("event_name", data);
// 自分以外全員へ送る
socket.broadcast.emit("event_name", data);
// すべて(自分を含む全員)に送る
io.sockets.emit("event_name", data);
メッセージ受信 - on( "event_name" )
サーバーサイド/クライアントサイドで対となる"event_name"が紐付く
//1,
socket.on( "event_name", function( data ){
//送信元の socket.emit( "event_name", data ); と紐付く
});
//2,
socket.on( "custom event", function( data ){
//送信元の socket.emit( "custom event", data ); と紐付く
});
名前空間 - of('/chat_room')
名前空間を使ってコネクションの共有範囲グループを分割
たとえばチャットルームで区切るなど...
<script>
var socket = io.connect('http://localhost/');
var hoge_chat = socket.of('/hoge');
var fuga_chat = socket.of('/fuga');
hoge_chat.on('connection', function () {
hoge_chat.emit('hoge_in');
});
fuga_chat.on('connection', function () {
fuga_chat.emit('fuga_in');
});
</script>
揮発性メッセージ - socket.volatile.emit
Socket.IOメッセージ送信時、通常失敗した場合はリトライがかかる。
emitに「volatile」をつけることで揮発性メッセージとなる(一回きり)
座標追跡などタイマーを使用する場合に有効
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
var tweets = setInterval(function () {
getBieberTweet(function (tweet) {
socket.volatile.emit('bieber tweet', tweet);
});
}, 100);
socket.on('disconnect', function () {
clearInterval(tweets);
});
});
送信確認コールバック
送信先へのメッセージ送信が成功した時に発火する関数を定義
<script>
socket.emit('ferret', 'tobi', function (data) {
console.log(data); // data will be 'woot'
});
</script>
ホスティング
Socket.IOのサーバ実装をどこで行うか?
Node.jsが利用できるサービス
- Joyent
- https://no.de/
- Heroku
- http://www.heroku.com/
- DotCloud
- https://www.dotcloud.com/
- Node Ninja
- https://node-ninja.com/
- Cloud Foundary
- http://www.cloudfoundry.com/
- vps??
- etc
リアルタイムなSocket.IOを使って何ができるのか
アンケート 2
Socket.IOはどんなフィールドで使える(|使いたい)と思いますか?
トピック
- Chrome開発版がWebRTCを実装 - JavaScriptからカメラやマイクが利用可能に
- http://news.mynavi.jp/news/2012/01/23/041/
- .
質疑応答
質疑応答
Thunk You
ご清聴ありがとうございました!!