ws 라이브러리로 텍스트·바이너리 메시지 주고받기

ws 라이브러리로 텍스트·바이너리 메시지 주고받기

Node.js에서 WebSocket 클라이언트와 서버를 만들 때 가장 널리 쓰이는 라이브러리가 바로 ws예요. 사용법이 단순하고 빠르며, 방대한 Autobahn 테스트 스위트를 통과해서 신뢰성이 검증돼 있어요. 이 글에서는 ws를 설치하고 텍스트 메시지와 바이너리 메시지를 주고받는 가장 기본적인 패턴을 코드로 살펴볼게요.

출처: ws - npm

본문

설치

npm install ws

참고로 이 모듈은 브라우저에서는 동작하지 않아요. 문서에서 말하는 "클라이언트"는 WebSocket 통신에서 클라이언트 역할을 하는 백엔드를 뜻합니다. 브라우저 클라이언트는 브라우저 네이티브 WebSocket 객체를 써야 하고, Node.js와 브라우저에서 같은 코드를 쓰고 싶으면 isomorphic-ws 같은 래퍼를 사용할 수 있어요.

텍스트 텍스트 데이터 보내고 받기

ws 인스턴스를 만들면 open 이벤트에서 send()로 메시지를 보내고, message 이벤트에서 받은 데이터를 처리해요.

import WebSocket from 'ws';

const ws = new WebSocket('ws://www.host.com/path');

ws.on('error', console.error);

ws.on('open', function open() {
  ws.send('something');
});

ws.on('message', function message(data) {
  console.log('received: %s', data);
});

바이너리 데이터 보내기

바이너리 데이터도 send()에 그대로 넘기면 돼요. 예를 들어 Float32Array 같은 형식화 배열을 그대로 보낼 수 있습니다.

import WebSocket from 'ws';

const ws = new WebSocket('ws://www.host.com/path');

ws.on('error', console.error);

ws.on('open', function open() {
  const array = new Float32Array(5);

  for (var i = 0; i < array.length; ++i) {
    array[i] = i / 2;
  }

  ws.send(array);
});

간단한 서버

서버는 WebSocketServer로 만듭니다. 클라이언트가 연결되면 connection 이벤트가 발생하고, 그 안에서 클라이언트별로 message 이벤트를 붙여요.

import { WebSocketServer } from 'ws';

const wss = new WebSocketServer({ port: 8080 });

wss.on('connection', function connection(ws) {
  ws.on('error', console.error);

  ws.on('message', function message(data) {
    console.log('received: %s', data);
  });

  ws.send('something');
});

성능 옵션

bufferutil은 WebSocket 프레임의 데이터 페이로드를 마스킹·언마스킹하는 연산의 성능을 높여주는 선택적 바이너리 애드온이에요. 대부분의 플랫폼에 사전 빌드된 바이너리가 있어서 C++ 컴파일러가 없어도 됩니다.

npm install --save-optional bufferutil

WS_NO_BUFFER_UTIL 환경 변수를 설정하면 bufferutil을 쓰지 않도록 강제할 수 있는데, 사용자가 다른 사용자 애플리케이션의 패키지 검색 경로에 패키지를 넣을 수 있는 환경에서 보안을 강화할 때 유용해요.

더 알아보기