본문 바로가기

Node

socket 이벤트 / 버퍼(Buffer)

socket 대표적인 이벤트들

  1. data
    서버가 클라이언트로부터 데이터를 받을 때마다 발생한다. 데이터는 버퍼 형태로 제공되며 이를 문자열로 변환 혹은 원하는 형식으로 처리가능하다. 주로 요청을 처리 , 응답을 준비 할 경우 사용한다.
  2. end
    한쪽의 연결이 끝난경우에 발생한다. 소켓의 다른 쪽에서 FIN패킷을 보내어 데이터 전송이 완료되었음을 나타낼 때 발생한다. 소켓의 읽기 측면이 닫힌다. TCP프로토콜에서 FIN패킷을 보낸다는것은 더이상 데이터를 보내지 않겟다는 신호이다. 연결의 끝을 의미한다. 이 이벤트로 연결이 정상적으로 종료되었는지 확인가능하다. 주로 자원을 정리하거나 로그를 남길때 사용한다.
  3. error
    에러가 발생할 경우 발생한다. 이 이벤트가 발생한다면 이후에 바로 close이벤트가 호출된다.
  4. close
    양쪽의 연결이 모두 끝난경우에 발생한다. 소켓이 완전히 닫힐 경우를 의미하며 소켓이 완전히 종료되었음을 나타내는 이벤트이다. 리소스 해체나 후속 작업을 처리할 때 유용하다.

비교적 덜 사용되는 이벤트들

  1. connect
    소켓 연결이 성공했을때 발생
  2. drain
    쓰기 버퍼가 비워졌을때 발생 / 더 많은 데잍터를 써도 안전함을 의미한다.
  3. lookup
    호스트 이름을 해결한후 연결하기 전에 발생 /주소 패밀리와 주소에 대한 정보를 제공
  4. ready
    소켓이 사용 준비가 되었을 때 발생
  5. timeout
    소켓이 비활성 상태로 인해 타임아웃 되었을 때 발생 / 타임아웃이 설정된 경우에만 발생

버퍼(Buffer) 객체

버퍼 객체에 대해 이해하기전 바이트 배열에 대해 알아보자

  • 바이트 배열
    8비트 단위의 데이터 배열이다. 각 요소는 0부터 255 사이의 정수 값을 가진다(1바이트)
  • 바이트 배열의 용도
    이진 데이터 이미지,동영상,네트워크 패킷 등을 표현할 때 사용된다. 효율적인 메모리 사용과 빠른 데이터 전송이 가능하다.

버퍼 객체 란?

Buffer객체는 node.js에서 이진 데이터를 다루기 위한 특별한 객체이다.

JS의 문자열은 *UTF-16 형식으로 인코딩되어 있어 이진 데이터를 효율적으로 처리하기 어려운데

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

지원해주는 메서드 등이 존재함

  • 장점
  1. 고정 길이
    buffer객체는 고정된 크기의 바이트 배열이다. 모든 데이터가 1바이트 단위로 처리되므로 데이터 처리에 매우 유용함
  2. 빠른 접근
    buffer객체는 바이트 단위로 데이터를 직접 접근하고 조작할 수 있다. 이는 이진 데이터 처리에서 매우 유용함
  3. 메모리 효율성
    buffer 객체는 필요한 만큼의 메모리만 사용한다. 예를들어 1바이트의 데이터를 처리할 때 1바이트의 메모리만 사용한다.
  4. 호환성
    대부분의 네트워크 프로토콜과 파일 포맷이 바이트 단위로 데이터를 처리하므로 buffer 객체를 사용하면 추가적인 변환 과정 없이 쉽게 데이터를 주고받을 수 있다.
  • buffer객체의 변환 순서
  1. 객체안에 값을 ASCII(아스키 코드) 로 변환하여 바이트 배열에 저장한다..(10진수)
  2. 바이트 배열의 값을 16진수로 변환한다.
const buffer = Buffer.from('Chicken');
console.log(buffer);    // <Buffer 43 68 69 63 6b 65 6e>
console.log(buffer[0]); // 67 (C의 ASCII 값)

간단한 데이터 교환

  • 보낼 메시지를 Buffer객체의 인자로 바이트 배열을 만든다.
  const message = "Chicken";
  const buffer = Buffer.from(message);
  • write 메서드를 사용해서 버퍼 쓰기
client.write(buffer)
//서버의 콘솔
<Buffer 43 68 69 63 6b 65 6e>
  • 서버에서는 클라에서 받은 데이터를 그대로 재전송해준다.
  socket.write(data);
  
  //클라에서의 콘솔
  <Buffer 43 68 69 63 6b 65 6e>
  • UTF16 란?
    유니코드 문자를 16비트(2바이트) 단위로 인코딩하는 방식이다.

'Node' 카테고리의 다른 글

객체지향 패턴(Object-Oriented Patterns)  (0) 2024.10.29
TCP 이해하기  (0) 2024.10.28
Socket.io 기본 기능  (0) 2024.09.30
webSocket 게임 서버 개발 강의 코드 이해하기  (1) 2024.09.27
HTTP의 특징,webSocket의 특징  (2) 2024.09.26