�@�u����`�Anode.js���Ă�������ˁv�B�J���t�@�����X�Q����A���炭�̊Ԃ�New Bamboo�Г��ł�node.js�̘b�肪���x���オ���Ă����̂ł����A���ۂ�node.js���g���ĉ�������Ηǂ����͂�����ƍl�������˂Ă��܂����B���̍��́Anode.js���g�p����Web�t���[�����[�N�Ȃǂ��J��̃^�P�m�R�̂悤�ɏo�Ă��Ă����̂ł����A�u���܂ł�Web�T�[�o�ŏo���邱�Ƃ������u�������邾�����Ă����̂͂���܂�ʔ����Ȃ���ˁv�Ƃ����̂������ȋC�����������Ǝv���܂��B
�@���ꂩ��1�J���قnjo����2009�N��12���AWeb�̐��E�ɐV���ȃj���[�X������܂����BGoogle���J������u���E�U�̃I�[�v���\�[�X�łł���Chromium��WebSocket�Ƃ����V���ȋ@�\�������Ƃ����̂ł��B
�@WebSocket���ꌾ�Ō����ƁuWeb�̂��߂�TCP�v�ł��B���܂ł�Web��HTTP�v���g�R������{�Ƃ���������̂��̂ł����B�N���C�A���g�i�u���E�U�j�̓T�[�o�Ƀ��N�G�X�g��n���A�T�[�o�̓N���C���ƂɃ��X�|���X��Ԃ��Ƃ����X�^�C���ł��B
�@TCP��HTTP��艺�w�Ɉʒu����l�b�g���[�N�v���g�R���ŁA�N���C�A���g�ƃT�[�o�Ԃ̑o�����ʐM���\�Ƃ�����̂ł��B
�@TCP�T�[�o��node.js�ŏ����ƈȉ��̂悤�ɂȂ�܂��B
var net = require('net'); var sys = require('sys'); var server = net.createServer(function (stream) { var array = []; stream.setEncoding('utf8'); stream.on('connect', function () { stream.write('connected\r\n'); }); stream.on('data', function (data) { array.push(data.slice(0,-2)); stream.write('res: ' + array.join(',') + '\n'); }); stream.on('end', function () { sys.log('disconnected') stream.end(); }); }); server.listen(8127, 'localhost');
�@���̏�Ԃ�telnet����ƁA�ȉ��̂悤��TCP�T�[�o�Ƃ��Ƃ肷�邱�Ƃ��ł��܂��B
$ telnet 127.0.0.1 8127 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. connected a res: a b res: a,b c res: a,b,c d res: a,b,c,d ^]�@�@# Ctrl + ] ��telnet�ɏI���V�O�i���𑗂��Ă��܂� telnet> quit Connection closed. $
�@������TCP�T�[�o�͊e�Z�b�V�������Ƃ�array�Ƃ����z���p�ӂ��Ă����A���̓��N�G�X�g������ƁA���̃f�[�^��z��ɑ�����A�S�z��̌��ʂ����X�|���X�Ƃ��Ė߂��Ă��܂��B
�@HTTP�Ƃ̏d�v�ȈႢ�ł����AHTTP�͊e���N�G�X�g�A���X�|���X�͂܂������ʌ̂��̂ł���A�e���N�G�X�g�Ԃŏ�ԁi�X�e�[�g�j�����L���邱�Ƃ͂���܂���B�t�ɁATCP�̕��͈�x�N���C�A���g�ƃT�[�o�Ƃ̊ԂŐڑ����m�������ƁA���̌�̂����ŏ�Ԃ����L���邱�Ƃ��ł��܂��BHTTP�̂��Ƃ��X�e�[�g���X�ƌĂԂ̂ɑ��ATCP�̂��Ƃ��X�e�[�g�t���ƌĂт܂��B
�@���܂�HTTP�ŋ[���I�ɃX�e�[�g�����L����ɂ́A�ȉ��̕��@������Ă��܂����B
�@���Ƃ���HTTP��HTML������\�����邽�߂ɋK�肳�ꂽ���̂Ȃ̂ŁA�u���N�G�X�g�^���X�|���X�v�̒P���ȃ��f���ŏ\���������̂ł����A������Web�T�C�g���u�A�v�����v���Ă��Ă��錻�݂ł́A��̂悤�ȕ��@�ŋ[���I�Ƀ_�C�i�~�b�N�ȃA�v�������ɂ͌��E������܂��BWebSocket�͂���Ȍ��E��ł��j��\�����߂��V���ȃv���g�R���Ƃ����ėǂ��ł��傤�B
�@������WebSocket�̃X�e�[�g�t���Ȑ����𗘗p���邱�ƂŁu�T�[�o�T�C�h�v�b�V���v���������邱�Ƃ��ł��܂��B�K�v�ȂƂ��ɃT�[�o�T�C�h������𑗂邱�Ƃ��ł���A���_�ȃg���t�B�b�N�����点�܂��B
�@�Ⴆ�A�Ⴊ�~������A�ЊQ�̂Ƃ��ȂǂɌ�ʋ@�ւ̃T�C�g��j���[�X�T�C�g���A�N�Z�X���߂ŃT�C�g���_�E�����邱�Ƃ�����܂��B����́A��X�V�����^�C�~���O��������Ȃ����߂ɁA�݂�Ȃ����x���u���t���b�V���{�^�����v��������ł��傤�B����̓��N�G�X�g�^���X�|���X�Ƃ������f���̕��Q�ƌ����Ă悢�ł��傤�B
�@���������������T�C�g��Web�u���E�U�ŊJ���Ă����āiTCP�ł����ڑ��̊m���j�A�j���[�X���������Ƃ��̂݃T�[�o����N���C�A���g�̕��ɏ����v�b�V�����Ă����A�]�v�ȃg���t�B�b�N��}������͂��ł��B
�@�O�u���������Ȃ��Ă��܂��܂������AWebSocket���u���E�U����g�����߂�JavaScript API�͈ȉ��ł��B
var ws = new WebSocket("ws://example.com/service"); ws.onopen = function() { // Web Socket is connected. You can send data by send() method. ws.send("message to send"); .... }; ws.onmessage = function (evt) { var received_msg = evt.data; ... }; ws.onclose = function() { // websocket is closed. };
�@API�͔��ɒP���ł͂Ȃ��ł��傤���B
�@�܂��A1�s�ڂ�WebSocket�I�u�W�F�N�g���쐬������A�uonopen,onmessage,onclose�v�Ƃ���3�̃R�[���o�b�N�t�@���N�V�������`���邾���ł��B�T�[�o�̕��Ƀ��b�Z�[�W�𑗂肽���ꍇ�́usend()�v�Ƃ����t�@���N�V�������Ăяo�������ł��B
�@����WebSocket��API�A��قǗ�Ƃ��ċ�����node.js��TCP�T�[�o�T�C�h�̃R�[�h�ɔ��Ɏ��Ă���Ǝv���܂��H ���͂��̗�������Ƃ��ɁuWebSocket��node.js���č����̂ł́v�Ǝv���܂����B����node.js��WebSocket�T�[�o��T���Ă݂��Ƃ���A�v���g�^�C�v�ł̂悤�ȃ��C�u������2�قnj�����܂����B�����ŁA������g���A�T���𗘗p����Mac��Activity Monitor�̂悤�Ȃ��̂�Web�ł�����Ă݂邱�Ƃɂ��܂����B
�@�\�[�X�̑S����github���ɂ���܂��B�����́uwebsocket-server-node.js�v�Ƃ������C�u�������g���Ă����̂ł����A���͂��łɃ����e����Ă��Ȃ��悤�Ȃ̂Łunode-websocket-server�v�Ƃ������C�u�����ɕύX���ď��������Ă݂܂����B
�@�Ȃ��A����̃T���v����iostat-client.html�ł����A�킴�킴Web�T�[�o��ɒu���Ȃ��Ƃ��A�t�@�C�������[�J����ŊJ�������Ŏ��s�\�Ȃ͂��ł��B
var sys = require('sys') , http = require("http") , ws = require('./node-websocket-server/lib/ws'); var iostat = require('child_process').spawn("iostat", ["-w 1"]); var httpServer = http.createServer(); var server = ws.createServer({}, httpServer); function format (data) { // JSON�`����Output��ϊ�����R�[�h } // Handle WebSocket Requests server.addListener("connection", function(conn){ server.send(conn.id, "Connected as: "+conn.id); iostat.stdout.on('data', function (data) { server.send(conn.id, format(data)); }); }); server.addListener("close", function(conn){ sys.log("closed connection: "+conn.id); }); server.listen(8000);
�@�uconnection�v�Ɓuclose�v�Ƃ���2�̃R�[���o�b�N�����w�肵�Ă���_�́ATCP�T�[�o�̗�Ƒ�ώ��Ă��܂��ˁB�����Ⴄ�_�Ƃ��ẮA�u���E�U����̓��͂���炸�A
var iostat = require('child_process').spawn("iostat", ["-w 1"]);
�̂Ƃ���Ŏq�v���Z�X�����Aiostat�Ƃ����R�}���h��1�b������CPU��IO�����o�͂���悤�ɂ��Ă���_�ł��B�����āA
iostat.stdout.on('data', function (data) { server.send(conn.id, format(data)); });
�̂Ƃ���Ń`���C���h�v���Z�X�̏o�͌��ʂ�1�b���Ƃɏo�͂���悤�ɂ��Ă��܂��B
�@�u���E�U���̃R�[�h���������ăV���v���ł��B
webSocket = new WebSocket('ws://localhost:8000/iostat'); webSocket.onopen = function() { out.html('Connection opened.<br>'); }; webSocket.onmessage = function(event) { stats = event.data; data = JSON.parse(stats); drawCharts(total_array.reverse()); };
�@�uonmessage�v�R�[���o�b�N�Ƀf�[�^�������Ă��邽�тɁAJSON�f�[�^����͂��A���̌��ʂ��O���t�Ƃ��čĕ`�悵�Ă��܂��B
�@�����܂œǂǎ҂̊F����͎v����������܂���B�uAjax��Comet�ł��������Ƃ��ł����Ȃ��́H�v
�@�܂��ȉ��̐}�����Ă݂Ă��������B
�@�ŏ��̗��Ajax�ł��B���b���Ƃ�HTTP���N�G�X�g�𑗂��Ă��܂��B�@HTTP�̃��N�G�X�g�ƃ��X�|���X�ɂ̓w�b�_�[�����Ɉȉ��̂悤�ɂ��낢��ȕt�я���t���Ȃ�������܂���B
GET /index.html HTTP/1.1 Host: www.example.com
HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Etag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8 ��http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol����̗�
�@1���N�G�X�g�^���X�|���X�w�b�_�[���̂͐�KB�ƁA�����傫������܂��A���N�G�X�g�̍X�V�p�x�����ɂȂ��Ă���ƁA����̃��N�G�X�g�ʂ͔n���ɂȂ�܂���B�X�V�p�x��x������ƁA�~����������Ɏ�ɓ���Ȃ����A�X�V�p�x���グ��ƃT�[�o�ւ̃��\�[�X�v���������Ȃ�A�Ƃ����W�����}������邱�ƂɂȂ�܂��B
�@�܂��^���T�[�o�v�b�V���Z�p�̂���p��Ƃ��āuComet�v�Ƃ������̂�����܂��B����͂��낢��Ȏ������@�����݂��Ă���A�Ȃ��Ȃ�������Â炢�p��Ȃ̂ł����A��ʓI�Ȃ��̂ɁuLong Polling�v�ƌĂ����̂�����܂��B����͎��̂悤�ɗ���ɂȂ�܂��B
�@�܂��A�T�[�o���N���C�A���g���烊�N�G�X�g�����ہA�����Ƀ��X�|���X��Ԃ��̂ł͂Ȃ��A �R�l�N�V�������Ȃ����ςȂ��ɂ��Ă����܂��B�����ĉ��������X�V����Ƃ��ɂȂ��Ă��烌�X�|���X��Ԃ��܂��B����͎����ŏ��ɏq�ׂ��u�ЊQ���̍X�V�v��`���b�g�Ȃǐ��b�ȏ�Ɉ�x�������X�|���X��Ԃ��Ȃ��悤�ȃP�[�X�ł͗L���ł����A�X�V�p�x���オ���Ă���ɂ�AAJAX�Ɠ����悤�Ȗ�������邱�ƂɂȂ�܂��B�����Comet�Œ���I�ɋ^���v�b�V�����悤�Ƃ����ꍇ�A�u�ǂ̎��_�܂ł̃f�[�^���N���C�A���g�ɑ��M�������v�Ƃ����X�e�[�g�����ʂɊǗ����Ȃ�������܂���B
�@����Activity Monitor�̗������������unode.js��Long Polling�����Ŏ������܂����v�Ƌ����Ă����������̂ŁA�ނ��R�[�h�̈ꕔ�����Ă݂܂��傤�B
var rb = new lpb.LongPollingBuffer(200); var iostat = process.createChildProcess("iostat", ["-w 1"]) //Setup the listener to handle the flow of data from iostat iostat.addListener("output", function (data) { sys.puts(data); if(data.search(/cpu/i) == -1){ //suppress the column header from iostat rb.push(data.trim().split(/\s+/).join(" ")); } }); //Setup the updater page for long polling fu.get("/update", function (req, res) { res.sendHeader(200,{"Content-Type": "text/html"}); var thesince; if(url.parse(req.url,true).hasOwnProperty('query') && url.parse(req.url,true).query.hasOwnProperty('since')){ thesince = parseInt(url.parse(req.url,true)['query']['since']); } else {thesince = -1;} rb.addListenerForUpdateSince(thesince, function(data){ var body = '['+_.map(data,JSON.stringify).join(',\n')+']'; res.sendBody( body ); res.finish(); }); });
�@�u/update�v��URI�ɃN���C�A���g���Ō�Ƀf�[�^����������Ԃt���āA�T�[�o�̌��ݎ����Ɣ�r�B�����̃f�[�^�𑗂�悤�ɂ��Ă��܂��B�����N�G�X�g���Ƃ̃X�e�[�g���Ǘ�����R�[�h��ʓr�����Ȃ��Ƃ����Ȃ���ɁA����̂悤�Ɏ��Ԃ������ꍇ�A�u�N���C�A���g�}�V���̎��Ԑݒ肪�����Ɛݒ肳��Ă��Ȃ��ꍇ�͂ǂ��Ȃ�́v�Ƃ������P�[�X�ɂ��Ή�����K�v������ł��傤�B
�@�����WebSocket�ł����ŏ��ɐڑ����m�����鎞�Ɉȉ��̂悤�ȃ��N�G�X�g���T�[�o�̕��ɑ���܂��B
GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com ^n:ds[4U
�@�T�[�o�T�C�h�̓��N�G�X�g���������A�ȉ��̂悤�ȃ��X�|���X��Ԃ��܂��B
HTTP/1.1 101 WebSocket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS'y:G*Co,Wxa-
�@��{�I�ɂ͒ʏ��HTTP���N�G�X�g�^���X�|���X�Ƃقړ����ł��B
�@�����܂ł���AJAX��Comet�Ɠ����悤�Ɍ����邩������܂��A���̂��Ƃ���s���ăN���C�A���g�ƃT�[�o�̊ԂŐڑ����m�����ꂽ��́A�ȉ��̂悤�Ƀf�[�^�̑O���1�o�C�g���t�����u�f�[�^�t���[�~���O�v�Ƃ����`���Ńf�[�^�̂��Ƃ���s�����ƂɂȂ�܂��B
0x00[Data]0xFF
�y���zWebSocket�̃f�[�^�t���[���`���i0x00[Data]0xFF�j�́A���̉Ă��납��d�l�̕ύX���c�_����Ă��܂��B����A�A�ڒ��ɂ��d�l���ς��\��������܂��B
�@�ڑ�����HTTP���N�G�X�g�^���X�|���X�ɔ�ׂĖ��炩�Ƀf�[�^�]���̃I�[�o�w�b�h�����Ȃ��Ȃ�̂����Ď���Ǝv���܂��B
�@�����������p�t�H�[�}���X�̌��I�Ȍ���������炷�\�����߂�WebSocket�ł����A�h���t�g�N���҂ł���Google��Ian Hickson��������[�����O���X�g�̒��ňȉ��̂悤�ɏq�ׂĂ��܂��B
Reducing kilobytes of data to 2 bytes�cand reducing latency from 150ms to 50ms is far more than marginal. In fact, these two factors alone are enough to make WebSocket seriously interesting to Google.
�u���L���o�C�g�̃f�[�^�]���ʂ��i�Œ�j2�o�C�g�ցA150ms�̒x����50ms�ɂł���Ƃ�����A����͂킸���Ȍ���Ƃ������悤�Ȑ��₳�������̂ł͂Ȃ��B���ۂ���2�̎��������������Ă��AWebSocket��Google�ɂƂ��Ė{�C�ɂ�����ɂ͏\���Ȃ��̂��v
�@�܂�WebSocket�̂��ꂵ���_�Ƃ��ăN���X�h���C�����\�ȓ_���������܂��B
�@AJAX��Comet�̏ꍇ�A�����N���X�h���C���X�N���v�e�B���O���ł��Ȃ����߁AJSONP�Ȃǂ̃e�N�j�b�N�ƕ��p����K�v������܂����AWebSocket�͌����\�ł��i�ŏ��̃��N�G�X�g�w�b�_�[�̕�����Sec-WebSocket-Location���w�肵�Ă���̂ŁA����𗘗p���Ċ��m�̃h���C���̂݃A�N�Z�X�������Ƃ����������������邱�Ƃ��\�ł��j�B
�@���āA����͂����܂łł��B���A���^�C��Web�Ƃ͉����Ƃ������ƂƁAWebSocket�̎���������AAjax��Comet�Ƃ̈Ⴂ�ɂ��ďq�ׂ܂����B����́AWebSocket�̃u���E�U�̑Ή��Ȃǂ������A�Z�p�I�ۑ��T�[�o�T�C�h�̎�����Ȃǂɂ��Ă��Љ�����Ǝv���܂��B
Copyright © ITmedia, Inc. All Rights Reserved.