IT/Server

[Server] TCP Server - Buffer

wakelight23 2025. 1. 3. 20:29

JavaScript에서 Buffer란?

● Node.js에서 이진 데이터를 다루기 위한 특별한 객체

 

JavaScript 문자열 = UTF-16 형식으로 인코딩 되어 있어 이진 데이터를 효율적 처리가 어렵다.

더보기

UTF-16?

- 유니코드 문자를 16bit(2byte) 단위로 인코딩하는 방식

- 대부분의 일반적인 문자는 하나의 16bit 단위로 표현되지만, 일부 문자(보조 평면의 문자 등)는
  두 개의 16비트 단위(서로게이트 페어)로 표현된다.

● Buffer 객체(object)는 원시적인 이진 데이터를 저장하고 조작하는데 최적화되어 있다.

 

 

그래서 Buffer 객체를 쓰면 좋은 점?

● 이진 데이터를 다루기 위해 고안된 객체이기에 UTF-16의 비효율성을 해결

  ○ 고정 길이 : 고정된 크기의 바이트 배열이기에 모든 데이터가 1byte 단위로 처리되므로,
                       데이터를 다루기 쉽고 효율적이다.

 

  ○ 빠른 접근 : 바이트 단위로 데이터를 직접 접근하고 조작할 수 있기에 이진 데이터 처리에 매우 유용하다.

// Buffer 사용 예
const buffer = Buffer.from('Hello');
console.log(buffer);    // <Buffer 48 65 6c 6c 6f>
console.log(buffer[0]); // 72 (H의 ASCII 값)

   - 문자열 'Hello'는 각 문자의 ASCII 코드 값으로 변환되어 byte 배열에 저장된다.

    ○ 'H': 72 (10진수), 0x48 (16진수)

    ○ 'e': 101 (10진수), 0x65 (16진수)

    ○ 'l': 108 (10진수), 0x6c (16진수)

    ○ 'l': 108 (10진수), 0x6c (16진수)

    ○ 'o': 111 (10진수), 0x6f (16진수)

 

  ○ 메모리 효율성 : 필요한 만큼의 메모리만 사용한다.

                               → 1byte 데이터 처리할 때마다 1byte 메모리만 사용

 

  ○ 호환성 : 대부분의 네트워크 프로토콜과 파일 포맷이 byte 단위로 데이터를 처리하므로

                  추가적인 변환 과정 없이 쉽게 데이터를 주고받을 수 있다.

 

Buffer가 어떻게 받아지나 예시 코드로 봐보자

- 기본적으로 Server, Client 구조로 테스트

// 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.write(data); // 'data' 이벤트로 받은 data를 같은 socket에게 쓰기
  });

  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());
});
// 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');

  const message = 'Hello';
  const buffer = Buffer.from(message);
  client.write(buffer); // write 메서드로 버퍼 쓰기
});

client.on('data', (data) => {
  console.log(data);
});

client.on('close', () => {
  console.log('Connection closed');
});

client.on('error', (err) => {
  console.error('Client error:', err);
});

 


실행 결과 ▼

1. 처음실행하면 아무것도 없다가...

우리 서버 정상영업 합니다!

2. 클라이언트가 접속하면...

'Hello'를 Buffer 객체로!

3. 서버에서는 접속했다는 메시지와 Buffer 객체를 받는다.

어서오십쇼! 저쪽 신사분이 주문한 Buffer 입니다.