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을 쓰지 않도록 강제할 수 있는데, 사용자가 다른 사용자 애플리케이션의 패키지 검색 경로에 패키지를 넣을 수 있는 환경에서 보안을 강화할 때 유용해요.
더 알아보기
- npm — ws 패키지
- GitHub — websockets/ws 저장소
- WebSocket 프로토콜 — Wikipedia