感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Node.jsでWebSocketサーバを作ってみる。

<スポンサーリンク>

Node.jsでwebsocket

Node.jsにwebsocketモジュールをインストールする。

> npm install websocket

WebSocketサーバーをちょっとアレンジして写経してみる。
[server.js]

var http = require('http');
var WSServer = require('websocket').server;

var url = require('url');
var clientHtml = require('fs').readFileSync('client.html');

var plainHttpServer = http.createServer(function(req, res) {
	res.writeHead(200, { 'Content-Type': 'text/html'});
	res.end(clientHtml);
}).listen(8888);

var webSocketServer = new WSServer({httpServer: plainHttpServer});
var accept = ['localhost', '127.0.0.1'];

webSocketServer.on('request', function (req) {
	req.origin = req.origin || '*';
	if (accept.indexOf(url.parse(req.origin).hostname) === -1) {
		req.reject();
		console.log(req.origin + ' access not allowed.');
		return;
	}

	var websocket = req.accept(null, req.origin);

	websocket.on('message', function(msg) {
		console.log('"' + msg.utf8Data + '" is recieved from ' + req.origin + '!');
		if (msg.utf8Data === 'Hello') {
			websocket.send('sended from WebSocket Server');
		}
	});

	websocket.on('close', function (code,desc) {
		console.log('connection released! :' + code + ' - ' + desc);
	});
});

localhostの8888ポートで接続を待つWebSocketサーバ。
ブラウザからHelloと入力された場合にメッセージを送信する。

このserver.jsで読み込んでいるclient.html
[client.html]

<html>
<head>
</head>
<body>
<input id="message" type="text"><button id="send">send</button>
<div id="output"></div>

<script>
(function() {
	var ws = new WebSocket("ws://localhost:8888");
	var output = document.getElementById('output');
	var send = document.getElementById('send');

	function logStr(eventStr, msg) {
		return '<div>' + eventStr + ':' + msg + '</div>';
	}

	send.addEventListener('click', function() {
		var msg = document.getElementById('message').value;
		ws.send(msg);
		output.innerHTML += logStr('send', msg);
	});

	ws.onmessage = function(e) {
		output.innerHTML += logStr('recieved', e.data);
	};

	ws.onclose = function (e) {
		output.innerHTML += logStr('disconnect', e.code + ' - ' + e.type);
	};
}());

</script>
</body>
</html>

コンソールはこんな感じ。

C:\node\websocket>node server.js
Warning: Native modules not compiled.  XOR performance will be degraded.
Warning: Native modules not compiled.  UTF-8 validation disabled.
"Hello" is recieved from http://localhost:8888!
"Hello" is recieved from http://localhost:8888!

ブラウザでhttp://localhost:8888
にリクエストを投げると、画面が表示される。

で、ブラウザを閉じると

connection released! :1006 - Connection dropped by remote peer.

って表示される。WebSocketは双方向通信だから、切断されたことをサーバが検知できるんだね。

Helloと入れたとときだけWebSocketでレスポンスが返る。
あ、レスポンスって言わないのかな。TCPでつながってるわけだから。

もうちょっと勉強してみます。

勉強した本(参考文献)

Nodeクックブック

Nodeクックブック

感謝のプログラミング

今回で感謝のプログラミングは【440時間目】
10000時間まで、あと【9560時間】