Node JS

[node JS] websocket (ws)

seongjin08 2022. 7. 19. 15:03

express-generator 을 사용 해서 프로젝트를 만들었다.

 

$ npm install -g express-generator        //라이브러리 설치

$ express [프로젝트 명]     // 프로젝트 생성

$ cd [프로젝트명]    //프로젝트에 들어가기

$ npm i    //기본 라이브러리 설치

$ npm start     //실행 

 

http://localhost:3000 으로 들어가면 express 라는 화면이 뜰것이다.

 

$ npm install ejs ws  //html을 불어오기위한 라이브러리 ejs ,웹소켓을 사용하기 위한 ws 설치

 

 

websocket.js

const WebSocket = require('ws');

const clients = []

module.exports = () => {
  const websocket = new WebSocket.Server({
    port: 3333
  });

  websocket.on('connection', (ws, req) => { // 연결 후 웹 소켓 서버(wss)에 이벤트 리스너를 붙힘 - connection 이벤트

    clients.push(ws)

    // 이벤트 리스너(message, error, close) 세 개 연결
    ws.on('message', (message) => { // 클라이언트로부터 메시지 수신 시(메시지 왔을 때 발생), 클라이언트의 onmessage 실행 시 실행됨
      console.log(message.toString());

      clients.forEach(client => {
        client.send('문자 잘 받았어 답장 보낼게 ');
      })
    });

    ws.on('error', (error) => { // 에러 시(웹 소켓 연결 중 문제가 발생한 경우)
      console.error(error);
    });

    ws.on('close', () => { // 연결 종료 시(클라이언트와 연결 끊겼을 때 발생)
      clients.splice(clients.indexOf(ws), 1) //clients 에서 나간 clien 찾아서 삭제
      clearInterval(ws.interval); // setInterval을 clearInterval로 정리 - 안 적어주면 메모리 누수 발생
      console.log(clients);
    });


  });
};​

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>GIF 채팅방</title>
    </head>
    <body>

        <button id="button">testing</button>

        <script>
            const webSocket = new WebSocket("ws://localhost:3333");
            // 서버처럼 이벤트 리스너로 동작
            webSocket.onopen = function() { // onopen 이벤트 리스너 호출: 서버와 연결이 맺어지는 경우
                console.log('서버와 웹소켓 연결 성공!');
            };
            
            const button = document.querySelector("#button")

            button.addEventListener('click',()=>{  //버튼 클릭시 서버로 메세지 보내기.
                webSocket.send('클라이언트에서 서버로 메세지 보냅니다.');
            })

            webSocket.onmessage = function (event) { // 메세지를 받을 때
                console.log(event.data);
              
            };
        </script>
    </body>
</html>

www

const app = require('../app');
const debug = require('debug')('websoket:server');
const http = require('http');
const webSocket = require('../websocket');

const port = normalizePort(process.env.PORT || '3500');
app.set('port', port);

const server = http.createServer(app);


server.listen(port);

webSocket()

server.on('error', onError);
server.on('listening', onListening);

function normalizePort(val) {
  const port = parseInt(val, 10);

  if (isNaN(port)) {
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  const bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

function onListening() {
  const addr = server.address();
  const bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

 

실행 후 버튼을 누르게 되면 메세지를 주고 받을 수 있다.

'Node JS' 카테고리의 다른 글

[node JS] pkg  (0) 2022.12.28