46. Node.js 심화주차 - 소켓 통신(항해 23일차)

코이그·2023년 4월 25일

항해99

목록 보기
44/54

TCP vs. UDP

TCP와 UDP는 데이터를 송/수신하기 위해 사용되는 프로토콜이다.

TCP 특징

(Transmission Control Protocol)

  • 연결 지향 방식
  • 3-way handshake를 통한 연결, 4-way handshake를 통한 해제
  • 흐름 제어(패킷의 순서 보장) 및 혼잡 제어(패킷 유실 방지) 가능
  • 높은 신뢰성
  • UDP보다 느린 속도

3-way handshake

  1. SYN(접속 요청 패킷)
    • Client: "연결 가능?"
  2. SYN+ACK(요청 수락)
    • Server: "ㅇㅇ 가능"
  3. ACK(연결)
    • Client: "ㅇㅋ 연결함"

4-way handshake

  1. FIN(연결 종료 플래그)
    • Client: "연결 종료할게~"
  2. ACK(확인 메세지)
    • Server: "ㅇㅇ 잠만.. 이거만 하고.."
  3. FIN(연결 종료 플래그)
    • Server: "ㅇㅋ 종료함"
  4. ACK(연결 종료 확인)
    • Client: "ㅇㅋ 확인~"

UDP 특징

(User Datagram Protocol)

  • 연결 x
  • 소켓 대신 IP 기반 통신
  • 클라이언트-서버 간 1:1, 1:N, N:M 연결 가능
  • 데이터그램 단위로 데이터 전송, 크기 초과 시 잘라서 전송
  • 흐름 제어, 혼잡 제어 불가능
  • 신뢰성 x, 성능 o
  • TCP보다 빠른 속도

TCP vs. UDP 차이

소켓

소켓 - 데이터를 송수신할 때 반드시 거쳐야 하는 연결부.
패킷 - 소켓으로 소수신되는 데이터의 단위.

socket.io

자바스크립트에서 웹 소켓을 사용할 때 쓰는 라이브러리.

express + socket.io 실습

app.js

const express = require("express"); // express 모듈 불러오기
const { Server } = require("http"); // http 모듈 불러오기
const socketIo = require("socket.io"); // socket 모듈 불러오기

.
.
.

const app = express();
const http = Server(app); // express를 http로 감싸주기
const io = socketIo(http); // socket.io를 만들고 http를 할당해주기

const port = 3000;

connect(); // mongoose를 연결합니다.

// 소켓 사용자가 접속했을 때, 해당하는 콜백 함수가 실행된다
io.on("connection", (sock) => {
  console.log("새로운 소켓이 연결되었습니다.");

  // 클라이언트가 상품을 구매했을 때(BUY 소켓 이벤트) 실행된다
  sock.on("BUY", (data) => {
    console.log("구매한 정보입니다.");
    console.log(data);

    // 구매한 정보를 바탕으로 BUY_GOODS 메시지를 전달해야한다
    const emitData = {
      nickname: data.nickname,
      goodsId: data.goodsId,
      goodsName: data.goodsName,
      date: new Date().toISOString(),
    };
    // sock.emit을 쓰면 하나의 소켓에만 보내주는 것이기 때문에
    // io를 사용해서 소켓에 접속한 모든 사용자에게 보내준다
    io.emit("BUY_GOODS", emitData);
  });

  // 현재 접속한 소켓 사용자가 종료했을 때 실행된다
  sock.on("disconnect", () => {
    console.log(`${sock.id}에 해당하는 사용자가 연결을 종료했습니다.`);
  });
});

.
.
.

http.listen(port, () => {
  console.log(port, "포트로 서버가 열렸어요!");
});
profile
COYG🔴⚪

0개의 댓글