내일배움캠프 Node.js 트랙 47일차
Node.js와 소켓 프로그래밍
net 모듈
지난 TIL에서는 소켓이 무엇인지, 소켓의 종류에는 무엇이 있는지, 그리고 소켓 통신은 어떻게 이루어지는지 살펴보았다. 특히 KOCW 강의 자료를 참고하여 C언어 기반으로 쓰여진 코드들을 살펴봤는데, 모듈의 천국인 Node.js로 눈을 돌린다면 훨씬 쉬운 방식으로 TCP 서버를 여는 것이 가능하다.
그 역할을 해주는 것이 바로 net
모듈이다.
Node.js의 net
모듈은 TCP(Transmission Control Protocol) 및 IPC(Inter-Process Communication) 기반의 네트워크 애플리케이션을 생성하기 위해 제공되는 내장 모듈이다. 이 모듈을 사용하면 저수준의 네트워크 통신을 손쉽게 처리할 수 있다. net
모듈의 특징은 다음과 같다.
- TCP 소켓 서버와 클라이언트를 구현 가능.
- 스트림 인터페이스를 기반으로 데이터 송수신 처리.
- 비동기 I/O를 지원.
- 고성능 네트워크 애플리케이션 개발에 적합.
자, 이제 net모듈을 사용하면서 얼마나 간편하게 TCP 서버 구현이 가능한지 알아보도록 하자.
TCP 에코 서버
우선 TCP 에코 서버가 무엇인지부터 설명하겠다. 알다시피 에코라는 단어의 뜻은 메아리다. 즉, 클라이언트가 보낸 데이터를 그대로 클라이언트에게 다시 보내는 서버라고 이해할 수 있겠다. 중간에 별다른 로직을 수행할 필요가 없기 때문에(받은 데이터를 그대로 돌려주면 되기에) 네트워크 통신의 기본 개념과 TCP 프로토콜의 작동 방식을 이해하기 위한 가장 단순한 형태의 서버이다.
소켓 생성
net
모듈은 별도의 소켓 생성 과정이 존재하지 않는다. 아니, 정확히 말하자면 우리가 서버 객체를 호출하는 과정에서 net
모듈이 소켓을 생성하고 이를 관리해주는 객체를 반환해준다. 즉, net
모듈은 개발자가 직접 함수를 생성 함수를 작성하지 않아도, net.createServer()를 호출하면, 내부적으로 소켓 생성과 바인드(bind) 작업을 포함하여 서버를 설정한다. 서버 객체를 통해 소켓 생성 및 관리를 쉽게 할 수 있도록 도와주는 역할을 하는 것이다.
서버 객체 생성 함수 : net.createServer([options], [connectionListener])
- TCP 서버를 생성.
connectionListener
: 새로운 클라이언트 연결 시 호출되는 콜백 함수.- 반환값:
Server
객체.
import net from 'net';
const server = net.createServer((socket) => {
console.log('클라이언트 연결됨');
});
server.listen(8080, () => {
console.log('서버가 8080 포트에서 대기 중');
});
클라이언트: 소켓 생성
const client = new net.Socket();
클라이언트: 소켓 연결
net.connect(options, [connectListener])
또는net.createConnection()
- TCP 클라이언트를 생성하고 서버에 연결.
- 반환값:
Socket
객체.
client.connect(PORT, HOST, () => {
console.log('Connected to server');
});
이벤트 기반 설계
net
모듈은 이벤트 기반 구조로 설계되어 있다. 주요 이벤트는 다음과 같다.
서버(Server) 이벤트
connection
: 클라이언트가 연결되었을 때 발생.listening
: 서버가 연결 요청을 대기하기 시작할 때 발생.close
: 서버가 종료될 때 발생.
소켓(Socket) 이벤트
data
: 소켓이 데이터를 수신할 때 발생.end
: 연결 종료 요청 시 발생.error
: 에러가 발생했을 때 발생.timeout
: 설정된 시간 동안 소켓에서 활동이 없을 때 발생.
TCP 에코 서버 예제
import net from 'net';
// 서버 생성
const server = net.createServer((socket) => {
console.log('클라이언트 연결됨');
// 데이터 수신
socket.on('data', (data) => {
console.log('받은 데이터:', data.toString()); // 이때 받는 데이터는 버퍼 객체 형태이기 때문에 문자열로 변환을 해주어야 한다.
socket.write(data); // 받은 데이터를 그대로 클라이언트에게 전송
});
// 연결 종료
socket.on('end', () => {
console.log('클라이언트 연결 종료');
});
});
// 서버 시작
server.listen(8080, () => {
console.log('서버가 8080 포트에서 대기 중입니다.');
});
이전 글에서 C언어 기반으로 소켓을 어떻게 생성하였는지 돌이켜본다면, 쉽고 빠르게 TCP 서버를 생성하는 net 모듈의 장점을 실감할 수 있을 것이다.
'개발일지 > TIL(Today I Learned)' 카테고리의 다른 글
2025-01-07 <라디안과 삼각함수를 이용해 게임 로직 구현하기> (1) | 2025.01.07 |
---|---|
2025-01-06 <프로토콜 버퍼를 이용한 TCP 서버 통신> (1) | 2025.01.06 |
2025-01-02 <응용 계층에 대하여(1)> (0) | 2025.01.02 |
2024-12-31 (0) | 2024.12.31 |
2024-12-30 (0) | 2024.12.30 |
댓글