아래는 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
'AI' 카테고리의 다른 글
WebSocket 로드밸런싱 (0) | 2025.05.16 |
---|---|
ArubaOS 종류 (1) | 2025.05.16 |
TCP 소켓을 통해 JSON 데이터를 완전히 전송 (0) | 2025.05.15 |
동기(Synchronous) vs 비동기(Asynchronous) vs 블로킹(Blocking) vs 논블로킹(Non-blocking) 차이 (0) | 2025.05.10 |
mysql connect_timeout 이 10초일때, jdbc connectTimeout 는 몇초가 적당한가? (0) | 2025.05.07 |
Snappy 압축 라이브러리 (0) | 2025.04.28 |
자바 서버 → Snappy 압축 → 리액트 프론트에서 풀기 (0) | 2025.04.28 |
AoA(Angle of Arrival) 스캐너 4대에서 얻은 방위각(Azimuth)과 고도각(Elevation) 정보를 사용하여 태그의 위치를 추정 (0) | 2025.04.24 |
댓글