카테고리 없음

노드JS SOCKET.IO

값싼외노자 2022. 12. 29. 10:04

먼저 소켓이란?

일종의 통신으로 서버와 클라이언트 간에 양방향 연결이 이루어지는 통신이다.

이 말은 서버에서 클라이언트로, 그리고 클라이언트에서 서버로도 요청하고 수신될 수 있는 특성을 가진다.

양방향이기에 실시간으로 값이 갱신,변경,출력될때 사용된다 (주식,코인,쇼핑몰 구매자알림,실시간 채팅방 등)

 

우선 노드js에서 소켓을 설치해 준다.

 

아래는 설치 명령어!

npm install socket.io -S
const express = require("express");
const { Op } = require("sequelize");
const jwt = require("jsonwebtoken");
const { User, Cart, Goods } = require("./models");
const authMiddleware = require("./middlewares/auth-middleware");
const { Server } = require("http");
const socketIo = require("socket.io");

const app = express();
const http = Server(app);
const io = socketIo(http);
const router = express.Router();

app.use(express.static("assets"));
app.use(express.json());

io.on("connection", (sock) => {
  // 소켓 사용자가 연결되었을때
  console.log("새로운 소켓이 연결되었습니다.");

  // io.emit("BUY_GOODS" , {
  //   nickname: '서버가 보내준 구매자 닉네임',
  //   goodsId: 10, // 서버가 보내준 상품 데이터 고유 ID
  //   goodsName: '서버가 보내준 구매자가 구매한 상품 이름',
  //   date: '서버가 보내준 구매 일시'
  // }); // 테스트용 코드기 때문에 지워도됨

  sock.on("BUY", (data) => {
    console.log(data);
    const emitData = {
      // 데이터를 전달해야하기에 객체로 만들어준다.
      nickname: data.nickname,
      goodsId: data.goodsId,
      goodsName: data.goodsName,
      date: new Date().toISOString(),
    };

    io.emit("BUY_GOODS", emitData); // 서버와 연결된 모든 클라이언트에게보냄(buy_goods라는 이벤트를 전달할거고 emitData라는 값을 전달할거다)
  }); // 만약 특정 사용자가 우리서버에 buy이벤트를 통해 데이터를 전달하게 된다면 해당 코드가 실행되도록

  sock.on("disconnect", () => {
    // 소켓 사용자가 연결이 끊어졌을때(새로고침이나 로그아웃 등)
    console.log(sock.id, "<의 사용자의 연결이 끊어졌습니다.");
  });
});

http.listen(8080, () => {
  console.log("서버가 요청을 받을 준비가 됐어요");
});

그 다음 express 모듈을 사용하여 서버를 실행하는데

const socketIo = require("socket.io");
const io = socketIo(http);

 

이 명령어는 웹 소켓을 사용하는 코드이다. 

 

웹 소켓은 기본적으로

socket.emit('소켓이름','보낼 데이터')로 데이터를 송신하며,

socket.on('소켓명',function(data)//보낸 데이터)로 수신하는 단순한 구조이다.

 

그리고 서버 쪽 코드는 다음과 같다.

  io.on("connection", (sock) => {
    console.log(sock.id, '연결');
    sock.emit("BUY", sock.id + '서버에서 클라이언트로 연결되었습니다.')
  

    sock.on("BUY", (data) => {
      console.log(sock.id,data);
      sock.emit("BUY",`Server가 ${data}를 받았습니다.`)

  });
});

서버에서 클라이언트로 연결될땐 buy 소켓명 서버에서 클라이언트로 연결되었습니다. 출력

클라이언트에서 서버로 연결될땐 buy server가 ${data}를 받았습니다 를 전송하는 구조이다.

 

이것으로 socket 의 기본 설정을 해보았다.