Block Rockin’ Codes

back with another one of those block rockin' codes

Socket.IO v0.7 のロードマップと新機能

Node と言えば、Socket.IO といっても過言ではないほど、Socket.IO は Node にとって大きい存在です。


先の NodeConf で、この Socket.IO の作者 [twitter@rauchg] より、
Socket.IO v0.7 にむけたロードマップについての発表がありました。
新機能や API の改善等、重要な変更があるようなので一部を紹介したいと思います。


資料は以下。

Socket.IO(0.7)


(注 2011/05/31 現在 v0.7 はブランチで開発中であり、以下の紹介は上記資料をもとに書いているため、実行確認はしていません。
正式にリリースされた場合は、実装をもとに別途エントリを作成すると思うので、このエントリ自体は更新されない予定です。)

API の改善

サーバインスタンス

これまでは、ソケット通信を確立するためには、 http サーバインスタンスを渡す必要が有りましたが、今後は必要なくなります。

// Before
var io = require(‘socket.io’);
io.listen(http.createServer());

// After
var io = require(‘socket.io’);
io.listen(); // creates one for us

var io = require(‘socket.io’);
io.listen(8000); // creates one for us and listens on port 8000
オプション設定

これまでは全体で共通する設定を listen() 時に一つ適応できましたが、
今後は、 configure() メソッドを通じて listen() とは別に設定できます。
また configure() は第一引数に環境('production','development','test' etc) を設定でき、設定を切り替える事ができます。
(おそらく express との連携を視野に入れた対応)

// Before
var io = require(‘socket.io’);
io.listen(app, {
  tranportOptions: {}
});

// After
var io = require(‘socket.io’).listen();
io.configure(function () {
  io.set(‘polling duration’, 30);
});

io.configure(‘development’, function () {
  io.set(‘log level’, 3);
});

新機能

揮発性メッセージ

volatile.send() で、送信したら消える、揮発性のメーセージ送信をすることができます。

io.sockets.on(‘connection’, function (socket) {
  var t = setInterval(function () {
    getStock(‘APPL’, function (price) {
      socket.volatile.send(price); // send して終わり
    });
  }, 500);
  socket.on(‘disconnect’, function () {
    clearInterval(t);
  });
};
JSON

json.send() で送信データがJSONである事を明示できます。(シリアライズ不要)

io.sockets.on(‘connection’, function (socket) {
  socket.json.send(‘string’);
  socket.json.send(5);
  socket.json.send([
        {}
      , {}
  ]);
});
メッセージディスパッチャ

複数プロセスや分散環境での容易なスケールを目的とした機能も強化されるようです。
想像ですが、デフォルトではメモリとシングルプロセスになりますが、おそらく Redis 等との連携、マルチコア環境の適応を視野に入れているのかと。

まず環境をまたいだ変数共有のようなことができるようです(?)。

io.sockets.on(‘connection’, function (socket) {
  socket.get(‘nickname’, function (err, nick) {
   // セッションに対して設定した nickname の操作。
  });
});


非同期に接続中のクライアントを取得する場合は以下、環境をまたぎ、非同期に取得するようです。

io.sockets.on(‘connection’, function (socket) {
  io.sockets.clients(function (clients) {
    // 接続中のクライアントに対する操作
  });
});
送達確認

単純に send() メソッドにコールバックを追加することで、送達確認処理ができるようになります。

// server side
io.sockets.on(‘connection’, function (socket) {
  socket.send(‘bye’, function () {
    // 送達確認
  });
});

// client side
var socket = io.connect();
socket.send(‘hi’, function () {
  // 送達確認
});
// server side
io.sockets.on(‘connection’, function (socket) {
  io.on(‘nickname’, function (nick, fn) {
    checkAvailability(nick, fn);
  });
});

// client side
var socket = io.connect();
socket.emit(‘nickname’, prompt(‘Nickname’), 
function (res) {
  // if the function arity > 0, a callback is passed
  // to the event listener and the protocol signals
  // this is a Data ACK
});
名前空間

for() を使って、イベントごとの名前空間を指定できるようになります。
(無ければデフォルト)

// namespace “” (default)
io.sockets.on(‘connection’, function (socket) {
  io.on(‘nickname’, function (nick, fn) {
  });
});

// namespace “/news”
io.sockets
 .for(‘/news’)
 .on(‘connection’, function (socket) {
   io.on(‘item’, function (nick, fn) {
  });
});


for() ではなく、connect() を使ってソケット自体の名前空間で分ける事ができます。

var socket = io.connect(‘http://localhost/chat’)
var socket2 = io.connect(‘http://localhost/news’)

これにより、イベントやメッセージをチャネルごとに操作する事ができます。
(これまでやってきたチャネリングのハックが、実装に取り入れられる。便利!)

var news = io.sockets
 .for(‘/news’)
 .on(‘connection’, function (socket) {
   io.on(‘item’, function (nick, fn) {
   });
   news.emit(‘item’);
 });

var stream = io.sockets
 .for(‘/stream’)
 .on(‘connection’, function (socket) {
   io.on(‘item’, function (nick, fn) {
   });
   stream.emit(‘item’);
 });
ファーストクラスイベント
io.sockets.on(‘connection’, function (socket) { 
  io.on('chat message', function () {                             
  });
  io.on(‘nickname change’, function () {
  });
  io.sockets.emit('user connected', socket.id);
});

What’s coming

Express.IO

さらに Express との連携を強化し、Express のセッションと Socket.IO のセッションを共有する Express.IO なるモジュールが公開される予定です。
Express の作者 Tj と Socket.IO の作者 Guillermo Rauch は同じ LearnBoost で働いているため、彼らは手を組みやすい状況なのかも知れません。
目指すところは 「リアルタイム Web 界の Rails」とのこと、期待できますね!!

Other

他にも

  • CI とクラウド上での自動テスト
  • より高速な Flash フォールバック
  • Websocket の仕様変更への追従

などと、開発に意欲的な事が伺えます。

まとめ

Socket.IO 自体の完成度が上がる事で、リアルタイムアプリケーションを開発する際に出来ることもより増えると思います。
Guillermo Rauch さんはとてもストイックな開発者なので、今後のコミットにも期待したいと思います。
(日本に来ないかな ボソ)

JSConf, NodeConf, Joyent に行ってきました。

行き先

JSConf, NodeConf, Joyent に行ってきます。 - Block Rockin’ Codes

すっかり報告が遅くなりましたが、無事に行ってまりました。
かなり充実した旅ができたし、本当に行ってよかったと思えました。

発表

今回の旅については、

http://www.java-users.jp/contents/events/ccc2011spring/

で発表させていただきました。

資料はこちら。

紹介

各カンファレンスの内容は、例年通りであればビデオが公式のサイト上で公開されると思うので、そちらを参照してもらえると良いと思います。
また NodeConf については、スライドのまとめがこちらに有ります。

a list of slides from nodeconf 2011

各カンファレンスで、面白いセッションがたくさん有りましたが、個人的に面白かったと思うものをいくつか挙げておきます。参考になればと。
(とりあえず資料にリンクの張れる物で)

JSConf
Multi-tiered Node Architectures - JSConf 2011 - Tom Hughes-Croucher
Node の多層アーキテクチャの話。"ファーム"という概念がおもしろい。後で考察ブログ書く。
NodeConf

Node v0.5 Roadmap Ryan Dahl
Ryan による Node v0.5-0.6 に向けたロードマップ。主に Windows 対応を強調。
How npm Works - Isaac Schlueter
NPM v1.0 に関する話と今後。 npat = npm Package Testers は注目。
Socket.IO (0.7) - Guillermo Rauch
Socket.IO の機能強化について。Express.IO は目玉!!
Running node.js in Production - Charlie Robbins
nodejitsu が培ったノウハウの話。彼らの挑戦が Node を引っ張っている。
Lessons Learned in Production(.keyファイル直リンク) - Matt Eernisse
Yammer で働く Geddy の作者による発表。こちらも実運用ノウハウ。
Hackers Asylum - Tim Caswell
Node のコミュニティの話。これはスライドより、ビデオで彼の素晴らしいトークを聞く事を推奨。

その他

Airbnb

今回の旅で、ポートランドでは Airbnb というサービスでステイ先を探しました。
Airbnb は部屋が余っている人などがそれを公開し、宿を探している人とつなげるサービスです。
自分はここで Richard という人の家に泊まることができました。
ここでは一泊 2000 円くらいで泊まれて、Richard もとてもいい人だったので、下手に高いホテルにひとりぼっちで泊まるよりよっぽど良かったです。
これから海外に行く人は是非!

Vacation Rentals, Homes, Apartments & Rooms for Rent - Airbnb

忍者Tシャツ

手ぶらなのもどうかと思い、吉祥寺の雑貨屋で購入。
Isaac は正直わからないけど、Marak はマジで喜んでくれてたと思うw
あちらに行かれる際は、参考にしてくださいw


なんで忍者?

長年の謎、なんでみんな「忍者」が好きなのか?何人かに聞いてみた。
闇にまぎれてスマートに超人的な仕事をこなす様が、エンジニアの理想と重なっているらしい。
同じ文脈で、ド派手にもの凄いテクニックで音楽を演奏したりする様から「ロックスター」も理想らしい。

"You are a RockStar" は褒め言葉。これまめ知識な!!

haibu

ある日 Jed からメールが来る。

Jed
「友達が "Haibu" っていう名前のプロダクトを出そうとしてるんだけど、名前どうかな?」
Jxck
「"Haibu" か〜。強いて言えば "廃部" や "背部" ってあって、前者はちょっとネガティブな意味だけど、まあ誰も気にしないだろうし、良いんじゃない?」
Jed
「ありがと :)」

nodejitsu/haibu · GitHub

25 セント

向こうで洗濯をする際、コインランドリーを使うなら 25 セント硬貨が 4 枚必要。
洗濯+乾燥なら 8 枚。
これは用意するのがマジで大変。たいていの物は何とかなるけど、これが一番大変だった。
アメリカに少し長く行くなら、できるだけ日本で用意して行きたい。(どこで用意できるか情報求む)

Computer History Museum

Computer History Museum に行った。この旅唯一観光っぽい観光。

色々なハードが展示してあるんだけど、MIDI 関連のコーナに俺の部屋に眠ってるこいつが展示されていて吹いたw

英語

Tumblr にも書いたけどもう一度。
この旅を通して思ったこと少し書いておく。英語のこと。


まず読むことは実はなんとかなる。twitter は短く色々詰め込むから難しいけど、案内文とか、スライドとかそういうのは結構読める。
書くのも、辞書を見ながら単語がわかれば、何かを伝えるのはそこまで難しくない。つまり、メールとかは結構できるんだよね。コミュニケーションの敷居として、多分一番低い。
話すのは、単語がわかれば何とかなる。時制とか、複数単数とか、冠詞とかはぐちゃぐちゃでも、たいていの場合意味をくんでくれる。
加えてノンバーバルコミュニケーションがあれば、生きていくくらいは何とかなる。


問題は聞くこと。


相手がゆっくりしゃべってくれれば何とかなる。一対一なら最悪もう一回聞いてしまえばいい。セッションとかになると、スライドを説明しているときは読みながら何となく着いていける。
知っている技術なら単語は共通だから何話しているのか位はわかる。ただもっと抽象的な(ビジョンとかそういう感じの話)は難しい。
そして質疑応答になるとかなりきつい。また、スピーカーが訛っているとさらにきつい。
一番きつかったのは、アラブ系の訛のあるタクシーの運転手に、電波の悪い携帯で電話した時。ノンバーバルが一切無く、本当きつかった。


俺は英語が特別得意な訳ではない。むしろできない。


一応翻訳プロジェクトに参加したりしてたので、ある程度読んだりはできるけど、一番鍛えるべきなのは聞くこと(ヒアリング)だなと思った。
これができないと、「議論」ができない。何を言っているのかが分からないと、その議論に着いていける知識的準備があっても全く参加できないから。
これからは、翻訳ばかりじゃなく、ヒアリングを鍛えていきたいなと思う。全体として、本当にちょっと旅行するくらいなら、別にしゃべれなくてもなんとかなるね。

感謝

ただ今回は色々体当たりしたから、多くの人に迷惑かけたと思う。そんなメチャクチャアウェイな場所にずっといたんだけど、あまり寂しくなかったのは、
日本から色々 Twitter やメールで話しかけてもらったりしたからだと思う。日本から色々話しかけてもらえたのは、(本人はそう思ってなくても)本当に支えになったなと思います。
色々アドバイスももらったりできたし、レスがもらえるとそれだけで心強い物ですね。つぶやく一方であまり細かく返信できなかったけど、本当にありがとうございました。

謝辞

東京についてから気がついた、「お土産」というものを何も買ってない。。
執筆者くらいは買っていくつもりだったんだけど、そんな余裕も無くすっかり忘れていた。
ということで、土産話で勘弁してください(汗)。@各位

東京Node学園で発表してきました。


遅くなりましたが、 東京Node学園 1時限目 : ATND で「Node におけるテスト手法」について発表してきました。

追記

リンク

自分の発表は HTML5Rock のプレゼンツールを用いて作成しています。
とりあえず直でスライドへのリンクを張ります、余力があれば PDF 化して SlideShare にも上げたいと思います。
録画と一緒に見て頂くと良いかと思いますが、録画に映っている物とレイアウトが若干変わっています。内容は("捕捉" に書いたの以外は)一緒です。

自分の資料
録画1
録画2(自分はこちら)
Togetter

今回の発表について

「テストについて」ということで、今回は

といった話を中心に、紹介っぽい内容にしました。

また、「Node のテスト」というよりも、もう少し広く捉えた以下のような話にも触れました。

  • 「最終的には CSJS、 SSJS 両方を同じ仕組みの上でテストしたい」
  • 「CI も回したい」
  • 「コード整形やらMinify(CSJS) やらといったビルドもまとめてしたい」
  • 「どうせなら、色々全部 JS でしたい」


「テスト」自体については、つい先日行われたShibuya.jsでも議論があったように、「Node でテスト」 どころか 「JavaScript でテスト」についても、まだまだこれからな部分が多いと自分は思っています。その意味で、FW/モジュールについても「鉄板はどれか」と言う話より前に、もっと色々な試行錯誤が必要なフェーズなのかなと感じています。

今回の発表が、これから Node および JavaScript 自体のテストをして行く上で、多少なりとも役に立てばと思います。

捕捉

今回、発表で触れた書籍のリンクを張っておきます。

Test-Driven JavaScript Development (Developer's Library)


この本は、CSJS に JsTestDriver、 SSJS に NodeUnit を用いたテスト方法が解説されています。出てくる Node のバージョンが古いため、そのまま写経が出来ない部分も有りますが、他にも細かいテクニックを紹介しているため、非常に参考になると思います。

そして、発表で本について触れたのに、 JsTestDriver について触れるのを忘れました。一応スライドの最後のリンク集には加えておきます。


最後に

資料/内容についてはフィードバック歓迎です。また、今回紹介した以外に、「こんなのもあるよ」といったアドバイスも頂けるとうれしいです。

執筆中の書籍でも、テストについては触れています。そうした経験も合わせて、また何らかの形でアウトプットできたらと思います。

node.js で エコーサーバと簡易コンテンツサーバ

追記

ここの内容は Socket.IO のバージョンが v0.7 に上がったことで、古くなりました。
v0.7 については Socket.IO API 解説 - Block Rockin’ Codes を参照してください。

本文

リアルタイムWebハッカソン : ATND に参加しました。

みなさん websocket を用いて開発する感じで、websocket の実装としては node.js を筆頭に
jetty や ChannelAPI の話も聞けてかなり充実したハッカソンだったと思います。

ここで自分は node.js の websocket ライブラリである socket.io をいじってたんですが、
いくつかアプリ書いて、共通するのは以下のような感じだなということで簡単なメモ。

socket.io でエコーサーバ

websocket でリアルタイムなアプリとなると、socket.io を使ってとりあえずエコーサーバ(サーバに送信すると、サーバがクライアント全員にそれを配信する)を実装する感じかと思います。
シンプルに書くとこれだけ。

var socketio = require('socket.io');

// websocket
var io = socketio.listen(server);

io.on('connection', function(client) {
    client.on('message', function(message) {
        //クライアントがメッセージを送って来たら実行される。
        //messageが送って来たデータ
        client.send(message); //送って来た本人だけに送る。
        client.broadcast(message); //送って来た人以外全員に送る。
    });
});

こんな感じに実装しておきます。

で、ここに投げて受け取るだけのクライアントは、 jQuery を使うとこんな感じ。

$(function() {

    // socket の生成
    var port = 8080;
    var socket = new io.Socket(null, {port: port});
    socket.connect();

    // 送信
    $('#button').click(function() {
        var message = $('#input').val();
        socket.send(message);
        return false;
    });

    // 受信
    socket.on('message', function(obj) {
        $('#output').text(obj);
    });

});

あとは、受け取ったクライアント側でそれをどう表現するかですね。



なので後は html やら js ファイルを配信出来れば良いわけです。

簡易コンテンツサーバ

node ではフレームワークを使わない場合は静的コンテンツの配信も自分でやる必要が有ります。
いちいち書くのは面倒くさいので、相対パスから必要なファイルが落ちるように、以下の様なものを書いておくと幸せになれます。

var http = require('http'),
    url = require('url'),
    path = require('path'),
    fs = require('fs'),

var port_local = 8080;

var load_static_file = function(uri, response) {
    // 相対パスで静的リソースを配信する。
    var tmp = uri.split('.');
    var type = tmp[tmp.length - 1];
    var filename = path.join(process.cwd(), uri);

    path.exists(filename, function(exists) {
        if (!exists) {
            response.writeHead(404, {'Content-Type': 'text/plain'});
            response.write('404 Not Found\n');
            response.end();
            return;
        }

        fs.readFile(filename, 'binary', function(err, file) {
            if (err) {
                response.writeHead(500, {'Content-Type': 'text/plain'});
                response.write(err + '\n');
                response.end();
                return;
            }

            switch (type) {
            case 'html':
                response.writeHead(200, {'Content-Type': 'text/html'});
                break;
            case 'js':
                response.writeHead(200, {'Content-Type': 'text/javascript'});
                break;
            case 'css':
                response.writeHead(200, {'Content-Type': 'text/css'});
                break;
            }
            response.write(file, 'binary');
            response.end();
        });
    });
};

これで、ファイルが一通り配れます。

結局リアルタイムウェブって

client.broadcast(message); 

この1行がリアルタイムらしさってことなんですかね。


なので、上のようなエコーサーバとファイルサーバを用意しておいて、
クライアント側でサーバのプッシュをうまいこと取り回す JS を書くって感じになることが多いかと思います。


という意味で上の二つはちょっとしたものを書くなら結構汎用的だと思います。


一応、動く様にした物を github に上げておきます。(socket.io.nodeは npm 等で用意してください。)

http://github.com/Jxck/node-blog-sample

cloneしたら移動して、

% node server.js

で起動して、http://localhost:8080/client.html でアクセス出来ます。

and more

上のような実装でちょっと遊んだら、次に欲しくなりそうなもの。

  • websocket のマルチチャネル
    • この実装では例えばチャットルームを複数作ることができないので、こういうのが欲しくなる。
  • 永続化(DB)
    • node でも DB を使う場合は KVS と合わせるのがトレンドのようです。mongo や redis あたりが多いようです。
  • テンプレートエンジン
    • haml とか使えるんですが、JS 大好きなあなたは jed/fab · GitHub に挑戦すると良いでしょうw


後はアイデア次第ですね。

node.jsのSocket IO-nodeでWebSocket

前回は、pywebsocketでのWebSocketを紹介しましたが、HTML5 hack-a-thonでは結局node.jsの実装である Socket IOとSocket IO-nodeを使いました。
こちらも備忘録。

node.js

node.jsはいわゆるサーバサイドJavaScriptの一つで、最近にわかに注目を集めてる(?)技術です。

主な特徴は

  • もちろん全てJSで書ける。
  • コアがGoogleのV8エンジンで速い
  • イベント駆動I/O


node.jsの概要自体は、こちらのPREZIを使ったプレゼンが簡潔で分かりやすいかと思います。

Introduction to node.js by Toshihiro Shimizu on Prezi


丁度今日、node.jsの48時間耐久Hack-a-thonが開催されていました。
その名も、Node.js Knockout。@さんも参加されてます。


Node.js Knockout | Nov 9-11th, 2013


node.jsについてはそのうちもう少し纏めた記事を書こうかなと思っています。
思った以上に手軽に色々出来るので、面白いです。


node.websocket.js

node.jsのWebSocket実装としては、ちょっと前までは以下のプロジェクトが良く紹介されていました。
今月のWeb+DB Press の「HTML5×CSS3」でもちらっと紹介されています。


guille/node.websocket.js · GitHub


とりあえずソースを取得し、runserver.js を起動したところ以下のようなエラーが出ました。

this.conn = new process.tcp.Connection();
                            ^
TypeError: Cannot read property 'Connection' of undefined


どうもこの実装は、node.jsのver 0.1.9以前でないと動かないようで、自分がビルドしているver 0.2.0ではサーバを起動することが出来ないようです。
(tcp.Connection()ではなくのAPIが変わってるみたいですね、今はnet.Stream() を使えばいいみたいです。)

プロジェクトのコミット自体が、2010/04/30で止まっていることを見ても、node.jsのバージョンアップに追従していないようです。

で、READE.mdには以下の記述。

Update: For a more complete and cross-browser/cross-platform solution, 
I recommend you check out Socket.IO and Socket.IO-node, which I'm actively maintaining.

今は、Socket.IOとSocket.IO-nodeをメインでメンテナンスしている。
そっちの方がより完璧なクロスブラウザ/クロスプラットフォームを実現しているので、そっちをお勧めするよ!

とのことです。

ということで、Socket.IOを使うことにします。

Socket.IO と Socket.IO-node

こちらも、node.websocket.jsと同じ作者の公開している実装です。
サーバ側の実装とクライアント側のライブラリの両方が提供されています。

Socket.IO-node

基本的にはWebSocketの実装というより、リアルタイム通信用のサーバ実装という位置づけのようです。
つまり、WebSocketが無いクライアントには、代替の手段を提供する実装になっているということで、以下をサポートしています。

    * WebSocket (with Flash policy support)
    * XHR Polling
    * XHR Multipart Streaming
    * Forever Iframe

node.jsはver0.1.102以上が必要とのことです。
また、クライアント側はSocket.IOを専用クライアントライブラリとして使います。
(普通のWebSocketオブジェクトを作成して試しましたが、通信は出来ませんでした。)

Socket.IO

Socket.IO-node専用のクライアントライブラリです。
これを使って実装すると、WebSocketの無いブラウザでもリアルタイム通信を実現することが出来ます。
READMEによるとサポートしているのは、

Supports

    * WebSocket
    * Adobe Flash Socket
    * ActiveX HTMLFile (IE)
    * XHR with multipart encoding
    * XHR with long-polling
    * JSONP polling (for cross-domain)

Tested on

    * Safari 4
    * Google Chrome 5
    * Internet Explorer 6
    * Internet Explorer 7
    * Internet Explorer 8
    * iPhone Safari
    * iPad Safari
    * Firefox 3
    * Firefox 4 (Minefield)

素晴らしいですね。
Draftの違いだけでなく、WebSocketの実装有無もカバーしてくれるので、WebSocketの無いブラウザでも同じコードで動かすことが出来るという点です。
多分現時点でここまで実用的なライブラリは中々無いと思います。


使い方

注意が必要なのは、二つが依存関係というか、二つペアで使うことを前提にしている点です。
なので、githubのソースも片方づつではなく、両方いっぺんに落として来て配備することが出来る様になっています。
Socket.IO-nodeの方に書かれてますが、以下の様に取得します。

git clone git://github.com/LearnBoost/Socket.IO-node.git socket.io-node --recursive
cd socket.io-node/example/
sudo node server.js


これで既にサンプルのchatアプリが動かせます。
それを動かしながら色々試してみたところ、前回の記事の様に、
サーバ:「来た物をそのまま返す」
クライアント:「サーバにただデータを投げて、ただ受け取る」
といった簡単な実装であれば、大まかにこんな感じで実装します。

//サーバ側の実装
var http = require('http'), 
    io = require('./path/to/socket.io'),

server = http.createServer(function(req, res){
    // サーバの設定
    res.writeHeader(200, {'Content-Type': 'text/html'});
    res.writeBody('<h1>Hello world</h1>');
    res.finish();
});

server.listen(8080); //リスニングするポート

var io = io.listen(server); //socketの取得

io.on('connection', function(client){
	//ユーザが接続して来たら実行される
	//接続時の初期化処理を書く

	client.on('message',function(message){
		//クライアントがメッセージを送って来たら実行される。
		//messageが送って来たデータ
		client.send(message); //送って来た本人だけに送る。
		client.broadcast(message); //送って来た人以外全員に送る。
	});

	client.on('disconnect', function(){
		//クライアントが切断したら実行される。
		client.broadcast(client.sessionId + ' disconnected' }); //他全員に切断した人のsessionIdを送る。
	});
});
//クライアント側の実装
//socket.io.jsファイルを読んでおく

//コネクションの確立
io.setPath('/path/to/socket.io/');
socket = new io.Socket('localhost',{port:8080});
socket.connect();

//データの送信
socket.send('data');

//データの受信
socket.on('message', function(data){
	//受信したら実行される
	//dataが受け取ったデータ
    console.log(data);
});


通信部分の実装自体は非常にシンプルですね。基本的にはこれだけです。
あとはこれどう使うかというアイデアだけです。


サンプルの中にあるChat等をいじりながら、色々試してみると良いと思います。

あと、今回のnode.js KOでも、リアルタイム系のアプリが多く有るようです。
おそらくSocket.IOを使った実装も多いはずなので、これらは多いに参考になると思います。
以下は、Hack-a-thonの作品と参加者の一覧。

Node.js Knockout | Nov 9-11th, 2013

メモ

node.jsは自分もまだ始めたばかりですが、今回使ってみて思ったところをメモしておきます。

  • node.jsは開発者がパフォーマンスをかなり気にしているだけあって、噂通りサクサク動いてる気がする。
  • イベント駆動IOの利点を生かして、こうしたソケット通信を用いたリアルタイムアプリケーションとnode.jsは相性が良いと言えそう。
  • Linux/Unixであれば導入する敷居はさほど高くない。
  • サーバ/クライアント共に同じ言語で書けるのは結構有り。
  • APIの実装も進み、フィレームワークもいくつか出ている。


node.js色々楽しみですね。