기본 콘텐츠로 건너뛰기

11월, 2011의 게시물 표시

node.js 로 만드는 좀 더 본격적인 TCP Server

서로 에코만 하는게 부족하다면 유닉스의 wall 채팅을 구현해보자.
사실 이것만 되면
누가 접속했는지도 알고
누가 누구한테 무얼 보낼 수 있는지도 아는 셈이므로
채팅방을 하든지
온라인대전 격투게임 서버를 만들던지
바카라(어이쿠 위험한 단어) 서버를 만들던지
엠엠오알피지 서버를 만들던지
알아서 주무르면 된다.

자 그럼 이 대단한 서버의 코드를 보자

var clients = [];
require('net').createServer(function(socket) {

  socket.on("connect", function() {
    clients.push(socket);
  });

  socket.on("close", function() {
    clients.splice(clients.indexOf(socket), 1);
  });

  socket.on("data", function(data) {
    var sender = this;
    clients.forEach(function(client) {
      if (client !== sender) client.write(data);
    });
  });
}).listen(1337,"0.0.0.0");

네트워크 프로그래밍 좀 해본 사람이라면 다리에 힘이 턱 풀릴 정도로 허무한 코드라고 할 수 있겠다.
코드를 위에서부터 말로 쭉 설명하자면

1. 빈 접속자 배열을 만든다.
2. connect 할때마다 접속자 배열에 해당 소켓을 추가한다.
3. close 하면 socket 의 위치를 찾아(indexOf) 해서 떼어낸다(splice)
4. data 즉 접속자로 부터 입력을 받으면 자기 자신이 아닌 다른 모든 소켓에게 쓰기를 한다.
5. 이 모든 것을 1337번 포트에 연다.

정말 간단하다.

node.js server pattern

에코 서버 3줄이면 된다는 걸 증명하기 위해선

require('net').createServer(function(socket) {
  socket.pipe(socket);
}).listen(1337,"127.0.0.1");

요정도면 충분.
접속/서버메시지/접속종료 구현은

require('net').createServer(function(socket) {
  socket.on("connect", function() {
    socket.write("hello\n");
  });
  socket.on("close", function() {
    console.log("closed");
  });
  socket.on("data", function(data) {
    socket.write("usay:"+data);
  });
}).listen(1337,"127.0.0.1");

이정도면 충분하겠다.