Programming/node.js2014. 9. 24. 12:21

1. Server 예시

  1. var io = require('socket.io').listen(8001);
  2. io.sockets.on('connection', function (socket){
  3. var room_id;
  4. socket.on('joinRoom',function(data){
  5. room_id = data;
  6. socket.join(room_id); //룸입장
  7. console.log('JOIN ROOM LIST', io.sockets.adapter.rooms);
  8. });
  9. socket.on('leaveRoom',function(){
  10. socket.leave(room_id);//룸퇴장
  11. console.log('OUT ROOM LIST', io.sockets.adapter.rooms);
  12. });
  13. socket.on('sendMsg',function(data){
  14. io.sockets.in(room_id).emit('msgAlert',data);//자신포함 전체 룸안의 유저
  15. //socket.broadcast.to(room_id).emit('msgAlert',data); //자신 제외 룸안의 유저
  16. //socket.in(room_id).emit('msgAlert',data); //broadcast 동일하게 가능 자신 제외 룸안의 유저
  17. //io.of('namespace').in(room_id).emit('msgAlert', data) //of 지정된 name space의 유저의 룸
  18. });
  19. socket.on('disconnect', function(){
  20. console.log('NOT USER DISCONNECT : ', socket.id);
  21. console.log('ROOM LIST', io.sockets.adapter.rooms);
  22. });
  23. /*
  24. * 룸리스트 콘솔로그
  25. * socket.io 1.x 에서 io.sockets.manager.rooms => io.sockets.adapter.rooms
  26. * ROOM LIST { qNADgg3CCxESDLm5AAAA: [ qNADgg3CCxESDLm5AAAA: true ],
  27. test_room:
  28. [ qNADgg3CCxESDLm5AAAA: true,
  29. '0rCX3v4pufWvQ6uwAAAB': true,
  30. 'iH0wJHGh-qKPRd2RAAAC': true ],
  31. '0rCX3v4pufWvQ6uwAAAB': [ '0rCX3v4pufWvQ6uwAAAB': true ],
  32. 'iH0wJHGh-qKPRd2RAAAC': [ 'iH0wJHGh-qKPRd2RAAAC': true ] }
  33. */
  34. });


2. Client

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <title>Insert title here</title>
  6. <script src="/js/jquery-1.11.1.min.js"></script>
  7. <script src="/js/socket.io.js"></script>
  8. </head>
  9. <body>
  10. </body>
  11. <script type="text/javascript">
  12. $(function(){
  13. var socket = io.connect('http://127.0.0.1:8001', {'forceNew':true,reconnection:false});
  14. socket.on('connect', function () {
  15. socket.emit('joinRoom','test_room');
  16. socket.on('msgAlert',function(data){
  17. alert(data);
  18. });
  19. });
  20. $('#leaveRoomBut').click(function(){
  21. socket.emit('leaveRoom');
  22. });
  23. $('#msgSendBut').click(function(){
  24. socket.emit('sendMsg','TEST_MSG');
  25. });
  26. });
  27. </script>
  28. <input id="leaveRoomBut" type="button" value="leaveRoom">
  29. <input id="msgSendBut" type="button" value="msgSend">
  30. </html>


Posted by 시니^^
Programming/node.js2014. 9. 20. 12:14

node.js는 싱글프로세스다 보니까 한개 데몬당 하나의 CPU 코어만 이용한다.


이걸 보완하고 위해서 클러스터를 이용한다.


자세한 api 설명은 아래 내용을 참고 하면 된다.

http://nodejs.org/api/cluster.html


1. 기본 샘플 사용 방법

  1. var cluster = require('cluster');
  2. var http = require('http');
  3. var numCPUs = require('os').cpus().length;
  4. if (cluster.isMaster) {
  5. //cpu갯수만큼 프로세스 실행
  6. for (var i = 0; i < numCPUs; i++) {
  7. cluster.fork();
  8. }
  9. cluster.on('exit', function(worker, code, signal) {
  10. console.log('worker ' + worker.process.pid + ' died');
  11. //서버가 죽었을시 프로세스 자동 추가 실행 또는 알아서 알람sms나 이메일등 모니터링 알람 처리
  12. cluster.fork();
  13. });
  14. } else {
  15. // Workers can share any TCP connection
  16. // In this case its a HTTP server
  17. http.createServer(function(req, res) {
  18. res.writeHead(200);
  19. res.end("hello world\n");
  20. }).listen(8001);
  21. console.log('PID ['+process.pid+'] HTTP SERVER');
  22. }


2. 프로세스 정보

$ node cluster.js PID [1571] HTTP SERVER PID [1573] HTTP SERVER PID [1574] HTTP SERVER PID [1575] HTTP SERVER $ ps aux | grep node root 1569 node cluster.js ### 클러스터 마스터node ###### root 1571 /data/nodejs/bin/node /data/nodejs/www/cluster.js root 1573 /data/nodejs/bin/node /data/nodejs/www/cluster.js root 1574 /data/nodejs/bin/node /data/nodejs/www/cluster.js root 1575 /data/nodejs/bin/node /data/nodejs/www/cluster.js


3. Kill 시 자동으로 프로세스 추가 실행됨

$ kill 1571
worker 1571 died
PID [1617] HTTP SERVER

$ ps aux | grep node
root      1569   node cluster.js
root      1573   /data/nodejs/bin/node /data/nodejs/www/cluster.js
root      1574   /data/nodejs/bin/node /data/nodejs/www/cluster.js
root      1575   /data/nodejs/bin/node /data/nodejs/www/cluster.js
root      1617   /data/nodejs/bin/node /data/nodejs/www/cluster.js


4. 추가적인 참고자료

Node JS 멀티코어 CPU 지원하기 - http://eclipse.or.kr/wiki/특집기사:Node_JS_멀티코어_CPU_지원하기

Cluster모듈에서 Socket.IO 사용하기 - http://blog.outsider.ne.kr/764




Posted by 시니^^
Programming/node.js2014. 9. 18. 19:14

1. http/ querystring만 사용


  1. var http = require('http')
  2. ,qs = require('querystring');
  3. http.createServer(function (req, res) {
  4. if( req.url == '/' && req.method == 'POST'){
  5. var postBody = '';
  6. req.on('data', function (data) {
  7. postBody += data;
  8. });
  9. req.on('end', function () {
  10. var post = qs.parse(postBody);
  11. //post데이터확인
  12. console.log(post['postname']);
  13. });
  14. res.end('true');
  15. }else{
  16. res.writeHead(404, {'Content-Type': 'text/plain'});
  17. res.end('404 ERROR');
  18. }
  19. }).listen(8001);


2. http / express  / body-parser 사용


  1. var express = require('express')
  2. ,http = require('http')
  3. ,bodyParser = require('body-parser');
  4. var app = express();
  5. app.use(bodyParser.urlencoded({extended: true}));
  6. //app.use(bodyParser.json());
  7. app.post("/", function( req, res){
  8. res.writeHead(200,{"Content-Type" : "text/plain"});
  9. //post데이터확인
  10. console.log(req.param('postname',null));
  11. res.end('test');
  12. });
  13. app.use(function( req, res){
  14. res.writeHead(404,{"Content-Type" : "text/plain"});
  15. res.end('404 ERROR');
  16. });
  17. http.createServer(app).listen(8001);


Posted by 시니^^
Programming/PHP2014. 9. 18. 16:16



elephant.io https://github.com/Wisembly/elephant.io


1. elephantio.php -  elephant.io 다운로드 src폴더 데이터에 대한 include 또는 require 파일 만들기

  1. <?php
  2. $___ELEPHANTIO_DIR = dirname(__FILE__);
  3. require $___ELEPHANTIO_DIR.'/Client.php';
  4. require $___ELEPHANTIO_DIR.'/AbstractPayload.php';
  5. require $___ELEPHANTIO_DIR.'/EngineInterface.php';
  6. require $___ELEPHANTIO_DIR.'/Engine/AbstractSocketIO.php';
  7. require $___ELEPHANTIO_DIR.'/Engine/SocketIO/Session.php';
  8. require $___ELEPHANTIO_DIR.'/Engine/SocketIO/Version1X.php';
  9. require $___ELEPHANTIO_DIR.'/Exception/MalformedUrlException.php';
  10. require $___ELEPHANTIO_DIR.'/Exception/ServerConnectionFailureException.php';
  11. require $___ELEPHANTIO_DIR.'/Exception/SocketException.php';
  12. require $___ELEPHANTIO_DIR.'/Exception/UnsupportedActionException.php';
  13. require $___ELEPHANTIO_DIR.'/Exception/UnsupportedTransportException.php';
  14. require $___ELEPHANTIO_DIR.'/Payload/Decoder.php';
  15. require $___ELEPHANTIO_DIR.'/Payload/Encoder.php';
  16. ?>


2. client.php

  1. <?php
  2. include 'lib/elephantio/elephantio.php';
  3. /*
  4. * Version1X arg2 Option : ['context'=>[], 'debug'=>false,'wait'=>100*1000,'timeout'=>ini_get("default_socket_timeout")];
  5. */
  6. $EIO = new ElephantIO\Client(
  7. new ElephantIO\Engine\SocketIO\Version1X('http://127.0.0.1:8001',['timeout'=>5])
  8. );
  9. $EIO->initialize();
  10. $EIO->emit('msgIn', array('data1','data2') );
  11. $EIO->close();
  12. ?>


3. nodejs server

  1. var io = require('socket.io').listen(8001);
  2. io.sockets.on('connection', function (socket){
  3. socket.on('msgIn',function(msg){
  4. console.log('Msg In : ',msg);
  5. });
  6. socket.on('disconnect', function(){
  7. console.log('NOT USER DISCONNECT : ', socket.id);
  8. });
  9. });
  10. /*
  11. * debug
  12. * Msg In : [ 'data1', 'data2' ]
  13. * NOT USER DISCONNECT : NPmXDQpuVM9OFYl0AAAA
  14. */


Posted by 시니^^
Programming/node.js2014. 9. 15. 18:21
$ yum install gcc gcc-c++
$ yum install openssl-devel make

$ wget http://nodejs.org/dist/v0.10.31/node-v0.10.31.tar.gz
※ http://nodejs.org/download/ 최신버젼받기

$ tar xvfz node-v0.10.31.tar.gz
$ cd node-v0.10.31

$ ./configure --prefix=/data/nodejs
{ 'target_defaults': { 'cflags': [],
                       'default_configuration': 'Release',
                       'defines': [],
                       'include_dirs': [],
                       'libraries': []},
  'variables': { 'clang': 0,
                 'gcc_version': 44,
                 'host_arch': 'x64',
                 'node_install_npm': 'true',
                 'node_prefix': '/data/nodejs',
                 'node_shared_cares': 'false',
                 'node_shared_http_parser': 'false',
                 'node_shared_libuv': 'false',
                 'node_shared_openssl': 'false',
                 'node_shared_v8': 'false',
                 'node_shared_zlib': 'false',
                 'node_tag': '',
                 'node_unsafe_optimizations': 0,
                 'node_use_dtrace': 'false',
                 'node_use_etw': 'false',
                 'node_use_openssl': 'true',
                 'node_use_perfctr': 'false',
                 'node_use_systemtap': 'false',
                 'python': '/usr/bin/python',
                 'target_arch': 'x64',
                 'v8_enable_gdbjit': 0,
                 'v8_no_strict_aliasing': 1,
                 'v8_use_snapshot': 'true',
                 'want_separate_host_toolset': 0}}
creating  ./config.gypi
creating  ./config.mk

$ make && make install

##### bin Path는 계정 및 shell환경에 맞게 profile 에 등록하기##
$ vi /root/.bash_profile
PATH=$PATH:$HOME/bin
PATH=$PATH:/data/nodejs/bin ##nodjs bin등록
export PATH
source /root/.bash_profile
##############################################################

$ /data/nodejs/bin/node -v
v0.10.31


## npm 이용한 forever 데몬프로그램 설치########################
$ /data/nodejs/bin/npm install -g forever 

## npm 이용한 socket.io 설치###################################
$ /data/nodejs/bin/npm install -g socket.io


Posted by 시니^^
Programming/node.js2014. 9. 15. 15:49

Node.js 책 잠시 보고 만든 샘플입니다.

그냥 참고용으로!!ㅎㅎ


1. Server Side Node.js Socket.io

  1. var io = require('socket.io').listen(80);
  2. var clients = {};
  3. io.sockets.on('connection', function (socket){
  4. //입장 및 닉네임체크
  5. socket.on('create_nickname',function(nickname,returnFunction){
  6. //닉네임중복체크
  7. var returnCode = 1;
  8. for ( var i in clients ){
  9. if ( clients[i] == nickname ){
  10. returnCode = -1;
  11. break;
  12. }
  13. }
  14. //닉네임체크확인 결과 전달
  15. returnFunction(returnCode);
  16. //닉네임체크 유효화됨
  17. if ( returnCode == 1 ) {
  18. //클라이언트 닉네임등록
  19. clients[socket.id] = nickname;
  20. //새접속자로인한 전체 유저리스트 전달함
  21. io.sockets.emit('user_list',clients);
  22. //전체유저 메세지전송
  23. io.sockets.emit('msgPush',{"nickname":"시스템","msg":clients[socket.id]+" 유저가 입장하셨습니다."});
  24. console.log('CONNECT : ',nickname+' ['+socket.id+'] '+'('+Object.keys(clients).length+'명)');
  25. }
  26. });
  27. socket.on('msgSend',function(data){
  28. //자신을 제외한 전체유저에게 메세지전송
  29. socket.broadcast.emit('msgPush',data);
  30. /*
  31. *socket.emit('msgPush',data);//자신에게만 보낼때
  32. *socket.broadcast.emit('msgPush',data);//자신제외 전체유저
  33. *io.sockets.emit('msgPush',data);//자신포함 전체유저에게
  34. *io.sockets.in(socket_id).emit('msgPush',data);//특정유저에게 귓속말시 socket_id추가입력하면됨
  35.     *io.of('namespace').emit('msgPush', data); //of 지정된 name space의 유저
  36. */
  37. console.log('Chat Msg : ','['+data['nickname']+'] '+data['msg']);
  38. });
  39. //접속종료시처리
  40. socket.on('disconnect', function(){
  41. if ( clients[socket.id] ){
  42. //유저이탈 메세지전달
  43. io.sockets.emit('msgPush',{"nickname":"시스템","msg":clients[socket.id]+" 유저가 나가셨습니다."});
  44. console.log('DISCONNECT : ', clients[socket.id]);
  45. //이탈유저닉네임삭제
  46. delete clients[socket.id];
  47. //유저이탈 전체유저리스트 갱신
  48. io.sockets.emit('user_list',clients);
  49. }else{
  50. console.log('NOT USER DISCONNECT : ', socket.id);
  51. }
  52. });
  53. });


2. Client

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Chat</title>
  6. </head>
  7. <body>
  8. <div id="chatJoin">
  9. <form id="chatJoinForm">
  10. 대화명 : <input id="nickname" name="nickname" type="text"> <input type="submit" value="입장">
  11. </form>
  12. </div>
  13. <div id="chatRoom" style="display:none;">
  14. <div id="msgList" style="float:left;width:500px;height:300px;border:1px solid #1D365D;overflow:auto;"></div>
  15. <div style="float:left;width:100px;height:300px;border:1px solid #1D365D;margin-left:3px;">
  16. <div style="border-bottom:1px solid #1D365D;">접속자</div>
  17. <div id="userList"></div>
  18. </div>
  19. <div style="clear:both;">
  20. <form id="chatMsgForm">ChatMsg : <input id="msgText" name="msg" type="text"> <input type="submit" value="전송"></form>
  21. </div>
  22. </div>
  23. </body>
  24. <script type="text/javascript" src="jquery-1.11.1.min.js"></script>
  25. <script type="text/javascript" src="socket.io.js"></script>
  26. <script type="text/javascript">
  27. $(function(){
  28. var socket;
  29. function createNickname(nickName){
  30. socket.emit('create_nickname',nickName,function(returnCode){
  31. if ( returnCode == 1 ){
  32. //정상적인 닉네임
  33. $('#chatJoin').hide();
  34. $('#chatRoom').show();
  35. $('#msgText').focus();
  36. }else{ //아니면 닉네임중복됨
  37. alert('존재하는 닉네임입니다.');
  38. $('#nickname').focus();
  39. socket.disconnect();
  40. }
  41. });
  42. }
  43. function msgAdd(data){
  44. var sHtml = '<div><span style="color:blue;">'+data['nickname']+'</span> : '+data['msg']+'</div>';
  45. $('#msgList').append(sHtml);
  46. $("#msgList").scrollTop($("#msgList")[0].scrollHeight);
  47. }
  48. $('#chatMsgForm').submit(function(event){
  49. event.preventDefault();
  50. var data = {"nickname":$('#nickname').val(),"msg":$('#msgText').val()}
  51. msgAdd(data);
  52. $('#msgText').val('');
  53. $('#msgText').focus();
  54. //서버에 입력메세지전달
  55. socket.emit('msgSend', data);
  56. });
  57. $('#chatJoinForm').submit(function(event){
  58. event.preventDefault();
  59. if ( !$('#nickname').val() ){
  60. alert("닉네임을 입력해주세요");
  61. $('#nickname').focus();
  62. return false;
  63. }
  64. /*
  65. *https://github.com/automattic/socket.io-client
  66. */
  67. socket = io.connect('http://127.0.0.1', {'forceNew':true,reconnection:false});
  68. socket.on('connect', function () {
  69. createNickname($('#nickname').val());
  70. });
  71. socket.on('user_list',function(clients){
  72. //심플테스트 버젼이라서 삭제하고 새로 갱신하는방안
  73. $('#userList').html('');
  74. for ( var i in clients ){
  75. if ( clients[i] == $('#nickname').val() ){
  76. sHtml = '<div style="font-weight:bold;">'+clients[i]+'</div>';
  77. }else{
  78. sHtml = '<div>'+clients[i]+'</div>';
  79. }
  80. $('#userList').append(sHtml);
  81. }
  82. });
  83. socket.on('msgPush',function(data){
  84. msgAdd(data);
  85. });
  86. socket.on('disconnect', function(){
  87. $('#msgList').html('');
  88. $('#nickname').val('');
  89. $('#chatJoin').show();
  90. $('#chatRoom').hide();
  91. alert('Server Disconnect');
  92. });
  93. socket.on('connect_error', function (data) {
  94. alert('CONNECT_ERROR : '+data);
  95. });
  96. });
  97. });
  98. </script>
  99. </html>


Posted by 시니^^
Programming/node.js2014. 9. 13. 11:44

메뉴얼 사이트

 - Application :  http://expressjs.com/api.html#express

 - Request : http://expressjs.com/api.html#req.params

 - Response :  http://expressjs.com/api.html#res.status

 - Router : http://expressjs.com/api.html#router

 - Middleware : http://expressjs.com/api.html#middleware.api


테스트 샘플자료 (자세한 내용은 위에 API 참조하면 방대함 정규식처리등 많음)

  1. var express = require('express'), http = require('http');
  2. var bodyParser = require('body-parser');
  3. var app = express();
  4. app.use(bodyParser());
  5. app.all('*', function( req, res, next){
  6. res.writeHead(200,{
  7. "Content-Type" : "text/plain"
  8. });
  9. next();
  10. });
  11. app.get("/", function( req, res){
  12. res.end("HOME DIR : /");
  13. });
  14. app.get("/test", function( req, res){
  15. res.end("HOME DIR : /test");
  16. });
  17. app.get("/params/:user", function( req, res){
  18. var sText = " Params : "+req.params.user; // OR req.param('user')
  19. sText += "\n GET : "+req.query.q; //search?q=test OR req.param('q')
  20. sText += "\n POST : "+req.param('name'); //POST name=tobi
  21. //sText += "Cookie : "+req.cookies.name; // Cookie: name=tj
  22. sText += "\n ip : "+req.ip; // req.ips When "trust proxy" is `true`, parse the "X-Forwarded-For"
  23. res.end(sText);
  24. });
  25. app.get("*", function( req, res){
  26. res.end("NOT PAGE");
  27. });
  28. http.createServer(app).listen(80, '127.0.0.1');
  29. console.log('HTTP URL : http://127.0.0.1:80/');


Posted by 시니^^
Programming/node.js2014. 9. 12. 16:42

자세한 내용은 메뉴얼 참조 http://nodejs.org/api/globals.html#globals_global


Global Objects

 - global

 - process

 - console

 - Class: Buffer

 - require()

 - require.resolve()

 - require.cache

 - require.extensions

 - __filename

 - __dirname

 - module

 - exports

 - setTimeout(cb, ms)

 - clearTimeout(t)

 - setInterval(cb, ms)

 - clearInterval(t)


변수류

__filename : 실행중인 경로포함 파일이름

__dirname : 실행중인 파일 경로까지만


실행한 Process 정보

 - http://nodejs.org/api/process.html#process_process_versions



Posted by 시니^^