웹 개발/node.js

Node.js(9) - 웹소켓

SolartheNomad 2023. 5. 27. 01:21

웹소켓이란?

- 실시간 양방향 데이터 전송을 위한 통신 기술

- ws 프로토콜 사용

- webSocket, Socket.io 등의 패키지를 사용하여 지원 가능하다. 

- HTTP와 포트가 공유하는 것이 가능하다. 

 

서버센트 이벤트(SSE)

- EVENTSOURCE 객체를 사용한다.

- 처음에 한 번만 연결하면 서버가 클라이언트에 지속적으로 데이터를 보낸다. 

- 클라이언트에서 서버로는 데이터를 보내는 것이 불가능함 

 

통신 방식 세가지 비교 

 

모듈 설치하기

npm i express express-session cookie-parser dotenv morgan nunjucks

 

 

프론트엔드에서 답장하기 

- new WebSocket은 인수로 서버의 주소를 입력함

- onopen 내장 이벤트리스너는 서버와 연결되었을 때 호출된다.

- onmessage 내장 이벤트리스너는 서버에서 메시지가 올 때 호출한다.

- event.datadp 서버 메세지 내용이 들어 있다.

- webSocket.send로 서버로 메세지 전달한다. 

 

 

클라이언트 - 서버 관계도 

socket.io 설치하기

- websocket과 똑같은 기능을 하지만, websocket으로 일일이 구축해야 했던 서버 구축을 자동으로 지원해준다. 

 

npm i socket.io

 

 

socketIO.js

const SocketIO = require('socket.io');

module.exports =(server) =>{
    const io = SocketIO(server , {path : '/socket.io'});

    io.on('connection', (socket) =>{ //웹 소켓 연결 시
        const req = socket.request;
    const ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress;

    console.log('새로운 클라이언트 접속!', ip, socket.id, req.ip); //요청에서 ip를 찾아서 꺼내쓰면 된다. 

    socket.on('disconnect', () => { // 연결 종료 시
      console.log('클라이언트 접속 해제', ip, socket.id);
      clearInterval(socket.interval);
    });
    socket.on('error', (error) => { // 에러 시
      console.error(error);
    });
    socket.on('reply', (data) => { // 클라이언트로부터 메시지
      console.log(data) // 
    });
    socket.interval = setInterval(() => { // 3초마다 클라이언트로 메시지 전송
      socket.emit('news', 'Hello Socket.IO');// 이벤트이름, 메세지 순서대로 보낸다. 이벤트이름까지 같이 보낸다. 
      //news라는 이벤트에 Helo Socket.IO라는 메세지를 보내라
    }, 3000);


    })
}

 

 

Socket.IO 패키지를 불러와서 익스프레스 서버와 연결하기

const io = SocketIO(server , {path : '/socket.io'});

- app.js 서버와 연결(server :첫 번째 인수)하고 클라이언트와 연결(경로 : /socket.io) 설정하기

 

 

 

 io.on('connection', (socket) =>{ //웹 소켓 연결 시
        const req = socket.request;
    const ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress;

connection  이벤트

- 서버와 연결되었을 때만 호출된다. 즉, 콜백 함수 형태로 설정됨

- 콜백으로 소켓 객체(socket)를 제공한다.

 

const req = socket.requst

- 요청 객체에 접근하기 

- socket.ip로 고유 아이디 확인이 가능하다.

 

disconnect 이벤트

- 연결 종료 시 호출 

 

 

error 

- 에러 발생 시 호출

 

reply 

- 사용자가 직접 만들 이벤트로 클라이언트에서는 reply 이벤트 발생 시 서버에 전달된다.

 

 

socket.emit

- 메세지 전달할 수 있도록 함

- 첫 번째 인수는 이벤트이름이고, 두 번째 인수는 메세지이다.