,

node.jsでWebsocket 2012/10

ネットサーフィンしていたらnode.jsの情報に出会いました。根がいい加減なので型付け弱い言語だと収集がつかなくなるので、Javascriptは基本的にはあまり好きでない言語ですが、最近HTML5の流行で書かざるを得なくなってきたので、ちょっと試してみようと調べてみました.
するとWebsocketの実装がされているということでした.いままで簡単に立ち上がるWebsocketのサーバ実装にお目にかかったことがないので試してみたのですが、表記が微妙に変わっていて半年前の情報でもコピペで動きませんでした.ということで2012/10月時点で動くコードを載せてみます.

まずhttp://nodejs.org/download/からバイナリをダウンロードして展開。
つぎに展開されたnode-v0.8.11-linux-x86/bin/にパスを通す。
サーバの実装を置くディレクトリを用意して、そこで npm install express socket.io ws を実行
サーバ側(websocket.js)のファイルは以下のとおり

var WebSocketServer = require('ws').Server
  , http = require('http')
  , express = require('express')
  , app = express();

app.use(express.static(__dirname ));

var server = http.createServer(app);
server.listen(8000);

var wss = new WebSocketServer({server: server});
wss.on('connection', function(ws) {
   var time=0;
  var id = setInterval(function() {
    ws.send('接続してから' + time + '秒経過', function() { /* ignore errors */ });
    time++;
  }, 1000);
  console.log('started client interval');
  ws.on('close', function() {
    console.log('stopping client interval');
    clearInterval(id);
  })
});

同じディレクトリにindex.htmlを用意



<script 
type="text/javascript" 
src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js">

<script>

// サーバに接続する
var host = window.document.location.host.replace(/:.*/, '');
var socket = new WebSocket('ws://'+host+':8000');

// メッセージを受けたとき
socket.onmessage = function(msg) {
   $('#receiveMsg').prepend('
' + msg.data + '
'); }; 接続してから1秒間隔で文字が表示される

そのディレクトリ上でnode websocket.jsを実行
ブラウザからhttp://localhost:8000/index.htmlを開く。

http://labs.cybridge.jp/2012/04/node-js.htmlを参考にしたのですが、半年前の情報にもかかわらずもう古いようです.
動くサンプルとして npm でsocket.ioの一部としてカレントに展開される
node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/examples/serverstats-express_3/
の内容を参考に書き直してみました.
npmをなんとなく使うとカレントにパッケージがインストールされてしまうということに気がつかずちょっとはまってしまいました.
ちなみにバージョンは
node-v0.8.11
express@3.0.0rc4
socket.io@0.9.10
ws@0.4.22
と1まで行ってないのが多い上にexpressも2から3でかなり変わったようなので、またAPI変わるのもそれほど遠くないかも。