ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js(9) - 웹소켓
    웹 개발/node.js 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

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

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

     

     

     

Designed by Tistory.