기본 콘텐츠로 건너뛰기

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"); 이정도면 충분하겠다.