Node.jsは、非同期イベント駆動モデルのサーバーサイドJavaScript環境で、非ブロッキングI/O(入出力が完了しないうちに他の処理を開始できる)という方式でクライアントからの多数のリクエストを短い時間で処理することができます。
Node.jsではWebSocketを利用することで双方向のメッセージ送信を可能にします。
サーバーからクライアントに情報を渡す仕組みとしては、Ajaxがポーリングにより毎回コネクションを生成したり、Cometのロングポーリングによる擬似プッシュを実現しているのに対して、WebSocketは一度コネクションが生成されたらそのコネクション上で何度でも双方向にメッセージの送受信を行えるため、サーバーのリソースもクライアントの待機時間も節約できます。
それでは、さっそくnodeをインストールしてみます。
$ mkdir -p ~/src/git $ cd ~/src/git/ $ git clone --depth 1 git://github.com/joyent/node.git $ cd node $ git checkout v0.4.11 $ ./configure $ make # make install
インストールができたら、以下のようなサンプルを作ってみます。
$ vi hello.js ~ var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337); console.log('Server is running'); ~
実行します。
$ node hello.js Server is running※AWS上で構築している場合はSecurityGroupでTCPの1337を開放する必要があります。
ここで、クライアント(Mac)のコンソールで以下のようにアクセスしてみます。
$ curl http://xx.xx.xx.xx:1337/ Hello World
次に、さきほどのhello.jsを以下のように書き換えて実行してみます。
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write("Hello\n"); setTimeout(function(){ res.end('This is the Node World !!!!\n'); }, 10000); }).listen(1337); console.log('Server running');
同じようにアクセスしてみます。
$ curl http://xx.xx.xx.xx:1337/ Hello
すると、一旦ここまでレスポンスが表示され、
10秒後に
$ curl http://xx.xx.xx.xx:1337/ Hello This is the Node World !!!!と "This is the node World !!!!" が追加で表示されます。
この時サーバークライアント間では、2つめのワードが返る間もコネクションが維持され、しかもサーバーはその間スループやロックやビジーになることなく他のアクセスの処理などを行うことができます。
見た目にはたったこれだけの違いなのですが、これによりとても多くの可能性をもつことになり様々な応用が期待できます。
今日はここまでです。