TCP 프로토콜을 사용하여 클라이언트가 보낸 데이터를 그대로 다시 돌려주는(Echo) 간단한 네트워크 서버이다.
동작 방식으로는
1. 클라이언트가 서버에 TCP 연결 요청 전송
2. 서버는 연결을 수락하고 클라이언트로부터 데이터 전달 받음
3. 받은 데이터를 그대로 클라이언트에게 재전송
4. 이후 처리
의 단계로 나누어진다.
이 3번의 과정에서 핸들러를 통해 데이터를 추가적으로 처리하는 등의 추가 동작이 가능하다. 비록 Echo 본연의 성질은 아니게 되지만 말이다.
이전에는 HTTP 기반 웹 서버를 학습했었는데, 사용 프로토콜이나 용도 등에서 서로 다른 면모를 보이는 서버라고 할 수 있겠다.
이전 웹 서버에서는 'express', 'prisma' 등 여러 라이브러리를 사용한 것에 비해 TCP Echo 서버는 사용하는 라이브러리가 별도로 있지 않다. 단순히 Node.Js 를 사용해 전반적인 기능을 구현하게 될 것이다.
npm init -y
기본적인 npm 을 통한 프로젝트 초기화만 진행한다.
이후 선택적으로 prettier 등을 사용할 수 있겠다.
통신을 위한 'net' 모듈을 통해 TCP 서버의 기본 세팅을 진행한다.
// server.js
import net from 'net';
const PORT = 5555;
const server = net.createServer((socket) => {
console.log(`Client connected from: ${socket.remoteAddress}:${socket.remotePort}`);
socket.on('data' , (data) => {
console.log(data);
})
socket.on('end', () => {
console.log('Client disconnected');
});
socket.on('error', (err) => {
console.error('Socket error:', err);
});
})
server.listen(PORT, () => {
console.log(`Echo server listening on port ${PORT}`);
console.log(server.address());
})
서버를 실행할 때는 'npm run server.js' 명령어를 통해 실행할 수 있다.
실행하게 되면
다음과 같은 로그가 출력되면서 서버가 정상적으로 실행된 것을 확인할 수 있다.
서버가 만들어졌다면, 서버와 통신할 클라이언트도 있어야 할 것이다.
별도의 파일을 생성하여
// client.js
import net from 'net';
// 서버에 연결할 호스트와 포트
const HOST = 'localhost';
const PORT = 5555;
const client = new net.Socket();
client.connect(PORT, HOST, () => {
console.log('Connected to server');
})
client.on('data', (data) => {
console.log(data)
});
client.on('close', () => {
console.log('Connection closed');
});
client.on('error', (err) => {
console.error('Client error:', err);
});
다음과 같이 작성할 수 있다.
서버와 동일한 포트 5555 번을 사용하고, client.connect 로 연결, client.on 을 통해 데이터를 받을 수 있게 해주었다.
여기서 서버와 클라이언트를 같은 프로젝트 내에 만들었지만 별도로 실행해주어야 하기에 npm 라이브러리 설치 시 생기는 package.json 파일을 다음과 같이 수정해주었다.
{
"name": "tcp-echo",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"dev": "node server.js",
"client": "node client.js" // 클라이언트 파일 실행
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"type": "module",
"devDependencies": {
"prettier": "^3.2.5"
}
}
스크립트 항목에 기본 세팅이 될 서버 코드를 dev로, 별도로 실행할 클라이언트 코드를 client 로 설정해주었다.
이후 서버 - 클라이언트 순으로 실행해보면
다음처럼 서버가 먼저 연결됐다는 로그, 이후에 클라이언트가 서버에 연결되었다는 로그가 출력되면서 두 매체가 정상적으로 연결됨을 알 수 있다.