본문 바로가기
AI

Node.js에서 TCP 소켓을 사용하여 JSON 데이터를 안전하게 수신하는 서버

by david100gom 2025. 5. 15.

아래는 Node.js에서 TCP 소켓을 사용하여 JSON 데이터를 안전하게 수신하는 서버 예제입니다. 이 예제는 길이 프리픽스 방식(length-prefixed) 을 사용하여 데이터가 모두 수신됐는지 판단합니다.


✅ Node.js TCP 서버 (길이 프리픽스 + JSON 수신 처리)

const net = require('net');

// 유틸: Buffer 앞 4바이트로부터 길이 읽기
function readMessageLength(buffer) {
    return buffer.readUInt32BE(0); // Big Endian 4바이트 정수
}

// TCP 서버 생성
const server = net.createServer((socket) => {
    console.log('클라이언트 접속');

    let buffer = Buffer.alloc(0); // 누적 버퍼

    socket.on('data', (chunk) => {
        buffer = Buffer.concat([buffer, chunk]);

        // 하나 이상의 메시지가 들어있을 수 있으므로 루프 처리
        while (buffer.length >= 4) {
            const messageLength = readMessageLength(buffer);

            // 전체 메시지가 도착했는지 확인
            if (buffer.length >= 4 + messageLength) {
                const jsonData = buffer.slice(4, 4 + messageLength).toString();

                try {
                    const parsed = JSON.parse(jsonData);
                    console.log('수신된 JSON:', parsed);
                } catch (err) {
                    console.error('JSON 파싱 오류:', err.message);
                }

                // 처리된 부분 제거
                buffer = buffer.slice(4 + messageLength);
            } else {
                break; // 아직 전체 메시지가 도착하지 않음
            }
        }
    });

    socket.on('end', () => {
        console.log('클라이언트 연결 종료');
    });

    socket.on('error', (err) => {
        console.error('소켓 에러:', err.message);
    });
});

server.listen(3000, () => {
    console.log('서버가 포트 3000에서 대기 중...');
});

✅ Node.js 클라이언트 예제 (테스트용)

const net = require('net');

const client = new net.Socket();

client.connect(3000, 'localhost', () => {
    const json = JSON.stringify({ name: 'Alice', age: 30 });

    const jsonBuffer = Buffer.from(json);
    const lengthBuffer = Buffer.alloc(4);
    lengthBuffer.writeUInt32BE(jsonBuffer.length, 0); // 길이 4바이트

    const message = Buffer.concat([lengthBuffer, jsonBuffer]);

    client.write(message);
    client.end();
});

🧠 요약

  • 송신: [4바이트 길이][JSON 문자열] 구조로 전송
  • 수신: 버퍼에 누적하고, 길이만큼 왔는지 확인해서 JSON 파싱
  • TCP의 스트림 특성에 안전하게 대응하는 구조

필요하면 \n 구분자 방식이나 WebSocket 기반 방식도 설명해드릴 수 있어요!

728x90

댓글