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. 19. 11:53

출처 샘플 참고 사이트

http://www.hacksparrow.com/node-js-udp-server-and-client-example.html


1. UDP Server

  1. var PORT = 7001;
  2. var HOST = '127.0.0.1';
  3. var dgram = require('dgram');
  4. var server = dgram.createSocket('udp4');
  5. server.on('listening', function () {
  6. var address = server.address();
  7. console.log('UDP Server listening on ' + address.address + ":" + address.port);
  8. });
  9. server.on('message', function (message, remote) {
  10. console.log(remote.address + ':' + remote.port +' - ' + message);
  11. });
  12. server.bind(PORT, HOST);


2. UDP Client

  1. var PORT = 7001;
  2. var HOST = '127.0.0.1';
  3. var dgram = require('dgram');
  4. var message = new Buffer('TEST!');
  5. var client = dgram.createSocket('udp4');
  6. client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
  7. if (err) throw err;
  8. console.log('UDP message sent to ' + HOST +':'+ PORT);
  9. client.close();
  10. });


3. PHP UDP Client

  1. <?php
  2. $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
  3. $in = 'test!';
  4. var_dump (socket_sendto($socket, $in,strlen($in), 0,'127.0.0.1',7001));
  5. socket_close($socket);
  6. ?>


Posted by 시니^^