node.js�̏Ռ���WebSocket���񂭖����FWebSocket�Ŗڎw���I ���A���^�C��Web�i1�j�i2/2 �y�[�W�j

» 2010�N10��05�� 00��00�� ���J
[���^�CNew Bamboo]
�O�̃y�[�W�� 1|2 �@�@�@�@�@�@

WebSocket�ƍŏ���node.js�A�v���uActivity Monitor�v

�@�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

  • �N�b�L�[�ɏ���ۑ�����
  • ���N�G�X�g��URI�p�����[�^�ɂ��ׂĂ̒l���w�肷��i��Fhttp://example.com/?val=[a,b,c]�j

�@���Ƃ���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. };

[��]WebSocket ��W3C�ɂ���ċK�肳���API��IETF�ɂ���ċK�肳��Ă��ʐM�v���g�R���ɂ���ĂȂ肽���܂��B�ȑO��API�̕����uThe Web Sockets API�v�i�����`�j�A�v���g�R���̕����uThe Web Socket protocol�v(�P���`)�Ƃ��Ă��܂������A���݂ł͗��҂Ƃ��uThe WebSocket �v�ɓ��ꂳ�ꂽ�悤�ł��B


�@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

TvƂč쐬A^C̍j^[̓iNbNōĐj �T���v���Ƃ��č쐬�������A���^�C�����̍������j�^�[�̓���i�N���b�N�ōĐ��j

�@�\�[�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

Ajax��Comet�Ɖ����Ⴄ�́H

�@�����܂œǂ񂾓ǎ҂̊F����͎v����������܂���B�uAjax��Comet�ł��������Ƃ��ł���񂶂�Ȃ��́H�v

�@�܂��ȉ��̐}�����Ă݂Ă��������B

Ajax vs CometiLong Pollingj vs WebSocket Ajax vs Comet�iLong Polling�j vs WebSocket

�@�ŏ��̗��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


�O�̃y�[�W�� 1|2 �@�@�@�@�@�@

Copyright © ITmedia, Inc. All Rights Reserved.

'; this.insertTarget = document.querySelector('#cmsBody .subscription') || document.querySelector('#cmsBody .inner'); }; BodyAdIMSWithCCE.prototype = Object.create(BodyAdContent.prototype); BodyAdIMSWithCCE.prototype.activate = function () { refreshGam('InArtSpecialLink'); } // global reference window.itm = itm; //entry point BodyAdEventBase.polyfill(); const bodyAdManager = BodyAdManager.getInstance(); bodyAdManager.addEventListener(BodyAdManager.EVENTS.READY, function (ev) { bodyAdManager.loadAdvertise(); }); bodyAdManager.init(); })();
�X�|���T�[����̂��m�点PR

���ڂ̃e�[�}

Microsoft  WindowsőO2025
AI for GWjAO
[R[h^m[R[h Zg by IT - ITGWjArWlX̒SŊ􂷂gD
Cloud Native Central by IT - XP[uȔ\͂gD
�V�X�e���J���m�E�n�E �y�����i�r�zPR
���Ȃ��ɂ������߂̋L��PR

RSS�ɂ‚���

�A�C�e�B���f�B�AID�ɂ‚���

���[���}�K�W���o�^

��IT�̃��[���}�K�W���́A �������A���ׂĖ����ł��B���Ѓ��[���}�K�W�������w�ǂ��������B