Node.js & MongoDB

TCP 서버와 소켓 객체 이해하기

net.Socket 객체

Socket 객체를 사용해 소켓 서버와 소켓 객체 둘 다 생성 가능하고, 생성된 서버와 클라이언트는 서로 간에 데이터를 읽고 쓸 수 있다. Socket 객체는 Duplex 스트림을 구성하기 때문에 Writable과 Readable 스트림이 제공하는 모든 기능을 제공한다. 예를 들면, write() 함수를 사용해 클라이언트나 서버에 쓰기 스트림을 보낼 수 있다. 또는 클라이언트나 서버에서 스트림 데이터를 위한 data 이벤트 핸들러를 사용할 수도 있다.

소켓 클라이언트에서 Socket 객체는 net.connect()net.createConnection() 호출 시점에 내부적으로 생성된다. 이 객체는 서버에 소켓 연결을 표현하기 위해 사용된다. Socket 객체를 사용해 연결을 모니터링, 서버에 데이터 전송, 서버로부터의 응답을 처리 등을 할 수 있다.

소켓 서버 상에서 Socket 객체는 클라이언트가 서버에 연결하는 시점이나 연결 이벤트 핸들러에 전달되는 시점에 생성한다. 서버에서는 Socket 객체를 사용해 클라이언트 연결과 클라이언트와 주고받는 데이터도 모니터링한다.

Socket 객체를 생성하려면 아래 함수 중 하나를 사용한다.

net.connect(options, [connectionListener])
net.createConnection(options, [connectionListener])
net.connect(port, [host], [connectListener])
net.createConnection(port, [host], [connectListener])
net.connect(path, [connectListener])
net.createConnection(path, [connectListener])

모든 함수는 Socket 객체를 반환한다.

Socket 객체를 생성하는 첫번째 방법은 options 전달인자를 사용해 소켓 연결을 정의한다. options에는 소켓 연결을 정의한 속성들이 들어있다. 두번째 방식은 porthost값을 직접 전달인자로 받는 것이다. 세번째 방법은 Socket 객체 생성 시 사용할 유닉스 소켓의 파일 시스템 위치를 path 전달인자로 받는 것이다.

Socket 객체가 생성되면 서버에 연결된 기간 동안 다양한 이벤트들을 발생시킨다.

소켓 서버를 구현한다면 소켓 연결 수립과 종료, 데이터 읽기 쓰기 과정에서 방출되는 다양한 이벤트를 처리하는 콜백을 등록할 수 있다.

다음 코드는 클라이언트의 Socket 객체 기본 구현을 보여준다.

var net = require('net');
var client = net.connect({port:8107, host:'localhost'}, function(){
    console.log('Client connected');
    client.write('Some Data \r\n');
});
client.on('data', function(data){
    console.log(data.toString());
    client.end();
});
client.on('end', function(){
    console.log('Client disconnected');
});

connect의 콜백 함수는 메시지를 남긴 후 일부 데이터를 서버에 쓴다. 서버에서 수신한 데이터를 처리하기 위해 on.data() 이벤트 핸들러가 구현됐다. 소켓 닫힘 처리를 위해 on('end') 이벤트 핸들러가 구현됐다.

net.Server 객체

TCP 소켓 서버를 생성하고 데이터를 읽기/쓰기가 가능한 연결을 만들기 위해 net.Server 객체를 사용한다. Server 객체는 net.createServer() 호출시 내부적으로 생성된다. 이 객체는 소켓 서버를 나타내고, 연결을 위한 수신 처리 후 서버 연결을 통한 데이터 송신/수신을 한다.

Server 객체를 생성하려면 아래와 같이 net.createServer() 함수를 사용한다.

net.createServer([options], [connectionListener])

options 전달인자는 소켓 Server 객체 생성시 사용되는 특정 옵션을 지정하는 객체다. connectionListener 콜백 함수는 연결된 클라이언트를 위한 Socket 객체를 전달한다.

다음은 Server 객체의 기본 구현 코드를 보여준다.

var net = require('net'); var server = net.createServer(function(client){ console.log('Client connected'); client.on('data', function(data){ console.log('Client sent ' + data.toString()); }); client.on('end', function(){ console.log('Client disconnected'); }); client.write('Hello'); }); server.listen(8107, function(){ console.log('Server listening for connection'); });

net.createSever() 함수의 콜백 함수가 클라이언트 Socket 객체를 전달받는 것을 확인하자. 클라이언트로부터 받은 데이터를 처리하려면 on.data() 이벤트 핸들러를 구현하고, 소켓 종료 처리를 하려면 on('end') 이벤트 핸들러를 구현한다. 위 코드에서는 listen() 함수를 사용해 8107 포트로 연결 수신한다.