node.js 유용한 모듈 (8) – socket.io

본 게시물은 원저자의 허락을 얻어 번역된 것입니다.

원문 링크 - http://www.catonmat.net/blog/nodejs-modules-socketio/

1회 연재 – dnode (RPC 라이브러리)
2회 연재 – optimist (옵션 파서)
3회 연재 – lazy (lazy 리스트 처리)
4회 연재 – request (HTTP 스트림 처리)
5회 연재 – hashish (해시 처리)
6회 연재 – read(쉬운 표준 입력 처리)
7회 연재 – ntwitter(트위터 API)

이번에 소개할 모듈은 socket.io다. 여러분들 대부분이 socket.io 모듈에 대해서 알고 있을 거라 생각하지만, 몇몇분들이 나에게 socket.io에 대한 기사를 다뤄줄 것을 요청했기 때문에 연재에서 포함시키기로 했다.

socket.io는 웹소켓 만들고 이를 통해 모든 브라우저에서 실시간 처리가 가능하게끔 해준다. 그것은 또한 빌트인 멀티플렉싱, 수평적 확장, 그리고 자동 JSON  인코딩/디코딩을 제공함으로써 웹소켓의 기능을 향상시켜준다. Socket.io는 LearnBoost의 공동 창업자인 Guillermo Rauch에 의해 작성됐다.

socket.io는 현재 환경에서 가능한 최상의 실시간 커뮤니케이션 방법을 선택한다. 여기 socket.io가 지원하는 모든 커뮤니케이션 방법 리스트가 있다.

  • WebSocket
  • Adobe® Flash® Socket
  • AJAX long polling
  • AJAX multipart streaming
  • Forever Iframe
  • JSONP Polling

예를 들어, 만약 여러분이 크롬 브라우저를 사용한다면 socket.io는 웹소켓을 사용할 것이다. 만약 웹 소켓을 지원하지 않는 브라우저를 사용한다면, 플래시 소켓, 롱 폴링 순으로 커뮤니케니션 방법을 설정할 것이다.

가장 기본적인 socket.io 예제를 살펴보자.

var io = require('socket.io');
var express = require('express');

var app = express.createServer()
var io = io.listen(app);

app.listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
  socket.on('disconnect', function () {
    console.log('user disconnected');
  });
});

이 예제는 아주 훌륭한 express라는 node 웹 프레임워크(express 모듈은 곧 연재에서 다룰 것이다)를 사용하는데, 웹 서버의 포트를 80번으로 설정하고 socket.io를 추가했다.

socket.io는 새로운 커넥션 연결을 대기하다가 브라우저가 새 커넥션을 생성할 때, 브라우저로 다시 { hello: 'world' }객체를 보내는 news 이벤트를 발생시킨다.

그것은 또한 my other eventdisconnect의 이벤트 핸들러를 설정한다. 웹 애플리케이션이 이런 이벤트들을 발생시키면, socket.io는  function (data) { console.log(data); } 콜백을 호출하는데 이는 단지 data를 콘솔에 출력하는 역할을 한다.

아래 코드는 클라이언트 측 코드이다. (브라우저에서 동작)

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

우선 socket.io.js 스크립트를 로드하고, http://localhost 으로 socket.io 커넥션을 생성한다. 이때 socket.io는 브라우저가 지원하는 가장 최선의 커뮤니케이션 방법을 선택한다. 만약 브라우저가 크롬이라면 웹소켓을 사용할 것이다. 그렇지 않다면 위에서 소개한 커뮤니케이션 방법 중에서 플래시 소켓, 롱 폴링 등의 순서로 순차적으로 조사하여 가장 최상의 방법을 선택할 것이다. 그런 다음엔 news 이벤트를 수신 대기하다가, 해당 이벤트가 발생하면 my other event 이벤트를 발생시킨다.

이런 식으로 여러분은 모든 종류의 실시간 애플리케이션 (가령,  웹 채팅 서버 웹 IRC 클라인트)을 개발할 수 있다.

socket.io는 네임스페이스, volatile 메시지 , 메시지 수신 확인 그리고 메시지 브로드캐스팅 같은 기능도 지원한다. 좀더 자세한 내용은 socket.io 도움말을 살펴보기 바란다.

npm을 통해 socket.io를 설치할 수 있다.

npm install socket.io

Socket.io의 GitHub 사이트: https://github.com/LearnBoost/socket.io.

아울러 socket.io 기반으로 RPC 함수를 호출했던 dnode (1회 연재)를 살펴보기 바란다.

If you love these articles, subscribe to my blog for more, follow me on Twitter to find about my adventures, and watch me produce code on GitHub!

2 Responses

  1. h.hyunwoo 2012-05-31 / 1:55 오전

    안녕하세요~ Node에 매력을 느껴 공부하고 있는 한 학생입니다. 간단한 서버 하나를 제작하고 있는데 궁금한게 생겨서 질문 드립니다 (_ _)

    이번화에 설명해주신 socket.io와 기본제공하는 net모듈에 있어서 어떤 차이가 있는지 간략하게 나마 알고싶습니다

    혹시나 보시게 되시면 답변 부탁드리겠습니다~

    ps. 블로그 감사히 잘 보고 배우고있습니다

  2. 2014-07-15 / 11:30 오후

    정보는 좋은데 뭔가 뜨믄 뜨믄 설명이네요.

    가장 기본적인 socket.io 예제를 살펴보자.
    라는 예제는 무슨 파일로 저장해서 서버에서 실행하거나 웹에서 불러오는지..

    이건 무슨파일인지 설명이 없으니 참;;;;
    아쉽네요..

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

다음의 HTML 태그와 속성을 사용할 수 있습니다: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>