Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

melius

[ws] Node.js WebSocket library 본문

library & framework

[ws] Node.js WebSocket library

melius102 2020. 2. 3. 17:15

https://github.com/websockets/ws

https://github.com/websockets/ws/blob/master/doc/ws.md

 

ws는 Node.js에서 WebSocket 통신을 가능하게 해주는 모듈이다.

브라우저에서는 Web API인 WebSocket 객체를 사용한다.

 

 

설치

$ npm install ws

 

 

WebSocket 서버 실행

express 모듈을 이용하여 서버를 실행하는 방법은 아래와 같다.

const express = require("express");
const WebSocket = require("ws");
const app = express();
app.set('port', process.env.PORT || 3000);

const server = app.listen(app.get('port'), () => {
    console.log('http://localhost:' + app.get('port'));
});

const wss = new WebSocket.Server({ server });

https 서버를 이용하는 방법은 아래와 같다.

const https = require('https');
const express = require('express');
const WebSocket = require("ws");
const fs = require('fs');
const app = express();
const port = process.env.PORT || 3000;

const credentials = {
    key: fs.readFileSync('ssl/private.pem'),
    cert: fs.readFileSync('ssl/public.pem')
};

const server = https.createServer(credentials, app);
server.listen(port, function () {
    console.log("HTTPS server listening on port " + port);
});

const wss = new WebSocket.Server({ server });

 

 

이벤트 핸들러 구현

생성된 WebSocket Server 객체(wss)에 클라이언트가 접속하면 connection 이벤트가 발생하며, 이벤트 핸들러의 첫번째 인자로 해당 연결에 대한 WebSocket 객체(ws)가 전달된다. 해당 WebSocket 객체를 이용하여 WebSocket 통신에 대한 데이터 처리부분을 구현하면 된다.

wss.on('connection', (ws, req) => {
    console.log('wss.on connection');
    const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    console.log('ip:', ip);

    // ws.binaryType = "nodebuffer"; // default
    ws.binaryType = "arraybuffer";
    // ws.binaryType = "fragments";

    ws.on('message', (message) => {
        if (typeof message == 'string') {
            // ...
            ws.send('msg from server');
        } else if (message instanceof Buffer) { // in case of "nodebuffer"
            // ...
        } else if (message instanceof ArrayBuffer) { // in case of "arraybuffer"
            // ...
        } else if (message instanceof Array) { // in case of "fragments"
            // ...
        } else {
            // console.log('Others:', Object.getPrototypeOf(message).constructor.name);
            // ...
        }
    });
    // console.log(ws.readyState == ws.OPEN);

    ws.on('error', (error) => { console.log(error); });
    ws.on('close', () => { console.log('ws.on close'); });
});

클라이언트에서 데이터를 전달하면 message 이벤트가 발생한다. 데이터가 Binary Data인 경우, WebSocket 객체의 binaryType 프로퍼티의 설정값에 따라 데이터를 다르게 해석한다. 또한, Web API와 같이 WebSocket의 연결상태를 나타내는 readyState 프로퍼티을 사용할 수 있다.

 

 

Comments