본문 바로가기
카테고리 없음

socket.io란?

by devyongi 2021. 11. 10.

웹 소켓을 사용하여 채팅방에 적합한 구조로 만든 패키지이다.
채팅방 구조가 아닌 경우에는 불필요할 수도 있다.

프론트에서 socket.io 셋팅


이벤트 리스너를 자유롭게 만들 수 있다, 서버로 데이터를 보낼 때에도 이벤트 이름과 함께 데이터를 보낸다.

const socket = io.connect("http://localhost:8005", {
  // ws가 아닌 http로 작성한다, 소켓을 지원하는 브라우저인지 처음에 확인하기위해서 설정한다. 맨 처음에는 폴링으로 요청을 하고, 소켓을 지원하는 브라우저일 경우, 웹소켓으로 송수신한다.

  // 처음부터 웹소켓으로 통신하고 싶다고 하면, 밑에 코드와 같이 transports: ["websocket"]을 설정해준다.
  path: "/socket.io", // 이 부분과 서버 코드 1번의 path값과 같아야한다.
  transports: ["websocket"],
});
socket.on("news", (data) => {
  console.log(data);
  socket.emit("reply", "Hello server");
});

서버에서 socket.io 셋팅


npm i socket.io

// socket.io
const SocketIO = require("socket.io");

module.exports = (server) => {
  const io = SocketIO(server, { path: "/socket.io" }); //socketio와 express서버 연결

  io.on("connection", (socket) => {
    // 소켓과 서버가 연결이 되면 실행
    const req = socket.request; // websocket과 달리 socket안에 requset객체가 있다.
    const ip = req.headers["x-forwarded-for"] || req.connection.remoteAddress;
    console.log("새로운 클라이언트 접속", ip, socket.id, req.ip); // socket.id로 특정사람을 선택할 수 있다.
    socket.on("disconnect", () => {
      // 연결 종료 시 (브라우저를 닫는 행위)
      console.log("클라이언트 접속 해제", ip, socket.id);
      clearInterval(socket.interval);
    });
    socket.on("error", (error) => {
      // 에러 처리 핸들링
      console.log(error);
    });
    socket.on("reply", (data) => {
      //클라이언트의 reply 이벤트로 보낸 메시지를 받는다.
      console.log(data);
    });
    socket.interval = setInterval(() => {
      // 3초마다 클라이언트로 news 이벤트로 메시지를 보낸다.
      socket.emit("news", "Hello client");
    }, 3000);
  });
};

socket.io에서는 프론트와 서버에서 서로 메시지를 보낼 때, 이벤트 이름을 설정할 수 있다. 그래서 발생한 이벤트에 대한 응답을 받을 수 있다.


클라이언트에서는 io객체를 제공받기위해 index.html파일에 <srcipt src="/socket.io/socket.io.js"></srcipt>를 넣어주어야한다. (만약, react를 사용한다면 socket.io-client 패키지를 따로 설치하여 처리하는 것으로 알고 있다.)


  • socket.emit("이벤트 명","데이터") : 이벤트명과 데이터를 서버나 클라이언트로 json형식으로 보낸다.
  • socket.on("이벤트 명", "데이터") : 이벤트명과 데이터를 서버나 클라이언트로 json형식으로 받는다.
  • socket.id : 브라우저 웹소켓에 대한 고유 id이다. (특정사람에 대한 처리를 할 수 있다.)

데이터와 이벤트 명을 함께 보내면서 이벤트 명에 맞는 처리를 따로 할 수 있고, socket.id를 사용하여 특정 사람에 대한 처리를 할 수 있는 부분에서 확실히 채팅에 특화된 패키지라고 느껴졌다. 직접 채팅을 구현해보면서 좀 더 확실히 알 수 있을 것 같다.


현재 개발공부중이며, 해당 글에 틀린 내용이 있을 수 있습니다. 부족한 부분에 대해서 피드백을 주시면 수정하겠습니다.

참고

Node교과서 - 제로초

댓글