웹 서버 기초 (#1. Echo Server)
2025-12-08
원시 바이트(raw bytes)를 전송하기 위한 양방향 채널이며 HTTP나 SSH와 같은 다른 애플리케이션 프로토콜을 위한 전송 수단(carrier)이라는 점요청-응답(request-response) 모델을 따름헤더(header)와 그 뒤에 오는 선택적인 페이로드(payload)로 구성
netcat명령어는 WSL, macOS 또는 Linux에서 사용할 수 있음
nc(netcat) 명령어는 목적지 호스트와 포트로 TCP 연결을 생성한 후, 해당 연결을 표준 입력(stdin)과 표준 출력(stdout)에 연결(마지막에 비어 있는 한 줄을 위해 ’엔터’를 눌러야 합니다)
바이트 스트림은 단순히 순서가 있는 바이트의 연속
특정 주소(IP + 포트)에서 리스닝(listen)하며 해당 주소로부터 클라이언트 연결을 수락(accept)소켓 핸들(socket handle)로 표현되며, 새로운 클라이언트 연결을 수락하면, 그 TCP 연결의 소켓 핸들을 얻게 됨전송(send)과 수신(receive)은 읽기(read)와 쓰기(write)라고도 불림 - 쓰기 측면에서는, 상대방에게 더 이상 보낼 데이터가 없음을 알리는 방법이 있음, 소켓을 닫으면(closing) 연결이 종료되고 TCP FIN이 전송리스닝 소켓
bind & listenacceptclose연결 소켓
readwritecloseUse this template 버튼을 클릭하여 템플릿을 복사cloneecho-server.ts 파일 생성server.on('connection', newConn)은 newConn 콜백 함수를 등록accept 연산을 수행하고 새 연결을 인자로 하여 콜백을 호출'connection' 인자는 ’이벤트(event)’라고 불리며, 콜백을 등록할 수 있는 대상'error' 이벤트가 있음)'data' 이벤트와 'end' 이벤트'data' 이벤트는 상대방으로부터 데이터가 도착할 때마다 호출되며, 'end' 이벤트는 상대방이 전송을 종료했을 때 호출socket.write() 메서드는 상대방에게 데이터를 다시 보냄socket.end() 메서드는 전송을 종료하고 소켓을 닫음socket.end()를 호출하여 이 시나리오를 쉽게 테스트할 수 있도록 함$ nc 127.0.0.1 12345
hello
hello
world
world
q
import * as net from "net";
function newConn(socket: net.Socket): void {
console.log('new connection', socket.remoteAddress, socket.remotePort);
socket.on('end', () => {
console.log('EOF.');
});
socket.on('data', (data: Buffer) => {
console.log('data:', data);
socket.write(data);
if (data.includes('q')) {
console.log('closing.');
socket.end();
}
});
}
let server = net.createServer();
server.on('error', (err: Error) => { throw err; });
server.on('connection', newConn);
server.listen({host: '127.0.0.1', port: 12345}); import * as net from 'net';
const HOST = '127.0.0.1';
const PORT = 12345;
const client = new net.Socket();
client.connect(PORT, HOST, () => {
console.log(`서버(${HOST}:${PORT})에 연결되었습니다.`);
const message = 'Hello, Echo Server!';
console.log('보냄:', message);
client.write(message);
});
client.on('data', (data) => {
console.log('받음:', data.toString());
client.destroy();
});
client.on('close', () => {
console.log('연결이 종료되었습니다.');
});
client.on('error', (err) => {
console.error('에러 발생:', err.message);
});| 버전 | 날짜 | 변경 내용 |
|---|---|---|
| v.20250922 | 2025-09-22 | Echo Server 코드 추가 |