카테고리 없음

[TIL] 버퍼객체와 바이트배열

WooKGOD 2025. 1. 7. 20:12
반응형

오늘은 어제 배웠던 게임 서버 개발 플러스 강의에 대한 부분을 천천히 정리해보고자 한다.

 


 

오늘 학습한 내용

 

이번 프로젝트는 net 모듈을 사용하여 TCP 서버를 만드는 것이다.

 

서버를 만드는 방식은 지난 프로젝트때 했던 웹소켓과 상당히 유사하다.

 

const server = net.createServer((socket) => {

  })

 

위와 같은 방식으로 서버를 만들 수 있다.

 

소켓에는 여러가지 이벤트들이 있다.

 

1. data

 

클라이언트로부터 데이터가 수신될 때 발생하며 이벤트를 통해 받은 데이터를 처리할 수 있다. 데이터는 버퍼 형태로 제공되며, 이를 문자열로 변환하거나 원하는 형식으로 처리가 가능하다.

 

2. end

 

소켓의 다른 쪽에서 FIN 패킷을 보내어 데이터 전송이 완료되었음을 나타낼 때 발생하며 소켓의 읽기 측면이 닫히게 된다. FIN 패킷을 보낸다는 것은 더 이상 데이터를 보내지 않겠다는 것을 의미한다.

 

3. close

 

소켓이 완전히 닫힐 때 발생하며 연결의 양쪽 끝이 모두 종료된 경우이다.

 

4. error

 

에러가 발생했을 때 발생하는 것으로 이벤트 이후 close 이벤트가 바로 호출된다.

 

 

바이트, 버퍼객체

 

바이트 배열(1바이트)이란? 8비트 단위의 데이터 배열, 각 요소는 0부터 255사이의 정수 값을 가진다.

 

이진 데이터로 이미지, 동영상 네트워크 패킷 등을 표현할 때 사용 - 효율적인 메모리 사용과 빠른 데이터 전송이 가능

 

 

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

 

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

# UTF-16 : 유니코드 문자를 16비트(2바이트) 단위로 인코딩

 

버퍼 객체의 특징 : 고정 길이, 빠른 접근 

 

만약 Hello 라는 문자열이 있다면 이때 바로 바이트 배열로 변환하는게 아니다.

문자열 >> 10진수(아스키코드) >> 16진수(바이트 배열)

 

 

트러블 슈팅

 

패킷 구조 설계 부분에서 발생한 에러

 

RangeError [ERR_OUT_OF_RANGE]: The value of "offset" is out of range. It must be >= 0 and <= 3. Received 4
    at new NodeError (node:internal/errors:405:5)
    at boundsError (node:internal/buffer:88:9)
    at Buffer.readUInt16BE (node:internal/buffer:334:5)
    at readHeader (file:///home/wook/tcp_echo/uts.js:6:27)
    at Socket.<anonymous> (file:///home/wook/tcp_echo/server.js:12:37)
    at Socket.emit (node:events:517:28)
    at addChunk (node:internal/streams/readable:368:12)
    at readableAddChunk (node:internal/streams/readable:341:9)
    at Readable.push (node:internal/streams/readable:278:10)
    at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
  code: 'ERR_OUT_OF_RANGE'
}

 

문제를 보았을때 readHeader 부분에 문제가 생긴 것 같지만 예상외로 client.js 부분의 header와 packet을 설정해준 부분에서 문제가 발생한 것이었다.

 

//기존 코드
const header = writeHeader(buffer.length, 10);
const packet = Buffer.concat([header, buffer]);
client.write(buffer); // 문제: 헤더가 누락됨

//수정된 코드
const header = writeHeader(test.length, 10);
const packet = Buffer.concat([header, test]);
client.write(packet); // 수정: 헤더와 본문 데이터를 함께 전송

 

헤더 데이터가 packet에 포함되었지만 기존 코드에서 헤더를 포함하지하고 buffer를 보냈기 때문에 데이터의 길이나 구조를 예상할 수 없어서 에러가 발생한 경우이다.

반응형