Socket.IOとリアルタイムなナニか

大阪Node学園一時限目

Socket.IOとリアルタイムなナニか

自己紹介

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リクエスト)は都度コネクションを貼り、レスポンスを待つ
httpプロトコル

WebSocketプロトコルイメージ

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

都度コネクションを貼る必要が無くなるので、結果通信ロスが減る。また、一回の通信データ量も少ない

WebSocket沿線

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使ったことがありますか?

  1. 仕事でもばりばり使っているよ
  2. 個人的にサンプルとかなら
  3. 気にはなっているが使ったことはない

Socket.IOピックアップ

v0.7で大きな変更が加えられた

Socket.IO v0.7からの変更点(抜粋)
名前空間
揮発性メッセージ
送信確認コールバック処理
etc...

Socket.IOで抑えておきたいポイント

コネクション接続時処理

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はどんなフィールドで使える(|使いたい)と思いますか?

  1. Web
  2. ゲーム関連
  3. モバイル関連
  4. たぶん無い
  5. その他

トピック

Chrome開発版がWebRTCを実装 - JavaScriptからカメラやマイクが利用可能に
http://news.mynavi.jp/news/2012/01/23/041/
.

質疑応答

質疑応答

Thunk You

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