본문 바로가기
TIL,WIL

socket.io

by GREEN나무 2024. 12. 16.
728x90

 

 

https://cdn.socket.io/socket.io-3.0.1.min.js

Socket.IO라는 실시간 양방향 통신 라이브러리를 포함한 JavaScript 파일입니다.

socet IO 3.0.1버전 

min : ocket.IO 클라이언트 라이브러리의 최소화된 버전(minified version)

Socket.IO란?

Socket.IO는  WebSocket 및 다양한 네트워크 기술을 기반으로 실시간 양방향 통신을 쉽게 구현할 수 있도록 설계된 JavaScript 라이브러리입니다.
주로 실시간 기능이 필요한 애플리케이션에서 사용됩니다.

 

socket.IO 설치

npm i socket.io # 소켓IO 설치

🔷 Socket.IO 특징

🔹 양방향 통신
      클라이언트와 서버 간 데이터를 실시간으로 주고받을 수 있습니다.

       respons를 기다릴 필요 없이 데이터를 전송할 수 있습니다.

🔹 이벤트 기반 구조
       메시지 전송이나 특정 동작을 이벤트로 정의하고 처리할 수 있습니다.

🔹 브라우저 호환성 

       WebSocket 미지원 환경에서는 Long Polling 등의 대체 방식을 사용합니다.
           WebSocket : 브라우저와 서버 간 실시간, 양방향 데이터 전송을 가능하게 하는 표준 프로토콜.
           HTTP 롱폴링 : WebSocket 연결이 불가능할 때 대안으로 사용.
           WebTransport : 최신 기술로 추가된 전송 방식.
       연결이 끊어질 경우 자동으로 재연결 시도.

🔹 안정성 
        자동 재연결: 네트워크 문제로 연결이 끊어지더라도 자동으로 복구.
        하트비트(heartbeat): 연결 상태를 주기적으로 확인해 안정성 제공.
        패킷 버퍼링: 연결이 끊어진 동안 전송 실패한 패킷을 자동으로 버퍼링.

🔹 확장성
       채팅 애플리케이션, 실시간 알림 시스템, 멀티플레이어 게임 등에 활용됩니다.

 

            네임스페이스(namespaces) : 애플리케이션 로직을 여러 네임스페이스로 분리 가능.

io.of("/admin").on("connection", (socket) => {
   console.log("Admin namespace connected");
});


            룸(rooms) : room은 여러 개의 채팅방을 만들고 소켓에 연결된 전체 클라이언트에게 broadcast를 보내거나, 

             room 별로 broadcast를 보낼 수 있다.

socket.join("room1");
io.to("room1").emit("message", "Hello, Room 1!");

 

🔷 Socket.IO 사용

  • 클라이언트 코드 (Node.js 기반):
  const socket = io('http://localhost:3000'); // 서버에 연결
  socket.on('message', (data) => {
    console.log('서버로부터 받은 메시지:', data);
  });

  socket.emit('message', '클라이언트 메시지'); // 서버로 메시지 전송

       io(url) : 서버와 클라이언트를 연결합니다.
         ex) const socket = io('http://localhost:3000');
       socket.on(event, callback) : 특정 이벤트를 수신하고 처리.
       socket.emit(event, data) : 특정 이벤트와 데이터를 서버로 전송합니다.

 

  • 서버 열기 (app.js)
import initSocket from './init/socket.js';

initSocket(server); // 서버 초기화

server.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

 

  • 서버 코드 (Node.js 기반):
const io = require('socket.io')(3000);

io.on('connection', (socket) => {
  console.log('사용자가 연결되었습니다.');

  socket.on('message', (data) => {
    console.log('클라이언트로부터 받은 메시지:', data);
    socket.emit('message', '서버에서 보낸 메시지');
  });
});

        io.on('connection', callback)  : 클라이언트가 연결되었을 때 실행됩니다.
        socket.on(event, callback)  : 클라이언트가 보낸 이벤트를 수신하고 처리합니다.
        socket.emit(event, data) : 클라이언트로 데이터를 전송합니다.

 

on( ) : 선언. 수신 처리
emit( ) : 호출. 송신

 

🔷송신 예제

io.emit(event, data) 모든 클라이언트로 전송 io.emit('message', 'Broadcast to all');
socket.emit(event, data) 송신한 클라이언트로 전송 socket.emit('message', 'Hello Back!');
socket.broadcast.emit(event, data) 송신자를 제외한 모든 클라이언트로 전송 socket.broadcast.emit('message', 'Hello!');
io.to(id).emit(event, data) 특정 클라이언트로 전송 io.to(socket.id).emit('message', 'Hello!');

 

🔷통신 흐름

🔹 클라이언트 연결

   클라이언트는 io.connect()를 사용해 서버에 연결.

   기본적으로 폴링 → WebSocket 업그레이드.

🔹 이벤트 송수신

   클라이언트가 emit으로 이벤트 전송. 

socket.emit('hello', 'world');

   서버가 on으로 이벤트 처리 후 응답 전송.

socket.on('hello', (msg) => {
  console.log('서버로부터 메시지:', msg);
});

 

🔹 연결 해제 및 에러 처리

disconnect 이벤트로 클라이언트 연결 해제를 감지.

error 이벤트로 예외 상황을 처리.

 

🔷활용 사례

🔹 채팅 시스템: 실시간 메시지 송수신, 사용자 상태 업데이트

🔹 알림 시스템: 새로운 알림을 클라이언트에 즉시 표시(실시간 알림 전송)

🔹 실시간 데이터 시각화: 주식 데이터나 센서 정보를 실시간으로 보여주는 대시보드

🔹 멀티플레이어 게임: 게임 상태를 모든 사용자와 동기화

 

🔷클라이언트-서버 간의 연결 안정성을 높이는 방법

1. 자동 재연결 및 복구 메커니즘

  • 재연결 시도: 클라이언트가 연결이 끊어지면 자동으로 다시 연결을 시도하도록 구현합니다.
    (예: Socket.IO는 재연결 옵션을 기본 제공).
  • 백오프 전략: 연결 시도를 일정 시간 간격으로 늘려가는 방식으로 서버 부담을 줄일 수 있습니다.

2. 네트워크 품질 감지 및 최적화

  • 클라이언트와 서버 간 네트워크 상태를 감지해 데이터 전송 속도나 빈도를 조정합니다.
  • 연결 품질에 따라 QoS(서비스 품질) 정책을 적용해 우선순위를 정합니다.

3. Keep-Alive와 Ping/Pong

  • Keep-Alive 메시지: 서버와 클라이언트가 정기적으로 짧은 패킷을 주고받아 연결 상태를 확인합니다.
  • WebSocket에서는 Ping/Pong 프레임으로 구현됩니다.

4. 부하 분산 및 다중 서버 환경

  • CDN이나 로드 밸런서를 사용해 트래픽을 여러 서버로 분산시켜 안정성을 높입니다.
  • 멀티 리전 배포를 통해 지리적으로 가까운 서버로 연결을 유도합니다.

5. 장애 복구 및 대체 경로 구성

  • 서버 장애를 대비해 대체 경로(백업 서버)를 구성합니다.
  • DNS 라우팅으로 장애 발생 시 트래픽을 다른 서버로 자동 전환합니다.

6. 프로토콜 최적화

  • WebSocket 대신 필요에 따라 UDP 기반 프로토콜(예: QUIC)을 사용해 더 낮은 지연 시간을 구현합니다.
  • 데이터 압축을 통해 대역폭 사용량을 줄이고, 전송 성능을 개선합니다.

7. 보안 강화를 통한 안정성 확보

  • TLS/SSL로 데이터 전송 보안을 유지합니다.
  • 악의적인 공격(DDoS) 방어를 위해 CDN이나 방화벽을 사용합니다.

Socket.IO와 WebSocket 비교

🔷 기본 개념

  • WebSocket:
    - WebSocket은 브라우저와 서버 간 양방향 통신을 위한 표준 프로토콜입니다.
    - 클라이언트와 서버 간 연결을 지속하며, 낮은 지연 시간과 효율적인 데이터 전송을 제공합니다.
    - WebSocket이 이미 지원되는 환경에서 추가 기능 없이 가벼운 실시간 통신이 필요한 경우 사용됩니다.
         예: 주식 차트 업데이트, 실시간 알림.
  • Socket.IO:
    Socket.IO는 WebSocket을 포함한 다양한 실시간 통신 기술(Long Polling, AJAX 등)을 추상화한 JavaScript 라이브러리입니다.
    WebSocket만 지원하는 것이 아니라, 여러 통신 방식을 조합하여 안정적이고 호환성 높은 실시간 통신을 구현합니다.
    브라우저 호환성 문제를 해결하거나, 자동 재연결과 같은 기능이 필요하고 복잡한 이벤트 기반 통신이 요구되는 경우 사용합니다.
       예: 실시간 채팅, 멀티플레이어 게임.

🔷 WebSocket과 Socket.IO  비교

구분 WebSocket Socket.IO
기능 단순 양방향 통신 WebSocket + 이벤트 관리, 재연결
지원 브라우저 최신 브라우저만 지원 다양한 환경에서 동작 가능
재연결 기본 제공하지 않음 자동 재연결 기능 내장
프로토콜 네이티브 WebSocket 프로토콜(ws://) HTTP 기반 확장 프로토콜
서버구성 서버와 직접 WebSocket 핸들링 필요 룸 관리, 브로드캐스트, 네임스페이스 등 지원
추가 기능 없음 룸 관리, 브로드캐스트 등 지원

 


Long Polling

Socket.IO WebSocket을 사용할 수 없는 환경에서 클라이언트와 서버 간 실시간 통신을 구현하기 위해 사용하는HTTP 기반의 통신 기법중 하나입니다.

 

🔷Long Polling의 동작 원리

  1. 클라이언트 요청 - 클라이언트가 서버에 데이터를 요청합니다.
  2. 응답 대기 - 서버는 새로운 데이터가 준비될 때까지 요청을 보류합니다.
  3. 응답 전달 - 새로운 데이터가 준비되면 서버가 클라이언트에게 응답을 보냅니다.
  4. 반복 요청 - 클라이언트는 응답을 받은 후 즉시 다음 요청을 보내며, 이러한 과정이 반복됩니다.

🔷Long Polling의 특징

  1. 서버의 비동기 응답 - 클라이언트의 요청을 오래 유지하고, 데이터가 준비되었을 때 응답합니다.
  2. 연속적인 요청-응답 -  서버에서 응답이 오면, 클라이언트는 즉시 새로운 요청을 보냅니다. 연결이 지속적으로 재설정됩니다.
  3. 실시간에 가까운 경험 제공 -  데이터 전송이 필요한 시점에 즉각적으로 서버에서 데이터를 가져올 수 있어 실시간처럼 보입니다.

장점 : 브라우저 호환성 우수, 구현이 간단.

단점 : 비효율적인 자원 사용, 서버 부하 및 지연 시간 증가.

🔷Long Polling과 WebSocket 비교

프로토콜 HTTP 전용 WebSocket 프로토콜(ws://)
연결 방식 요청마다 연결 생성 및 종료 한 번 연결되면 지속적인 연결 유지
지연 시간 서버 응답 시간에 따라 지연 발생 가능 매우 낮은 지연 시간
서버 부하 요청/응답 반복으로 부하 발생 연결 유지로 상대적으로 적음
브라우저 지원 모든 HTTP 지원 브라우저 최신 브라우저에서만 지원

 

🔷Long Polling이 사용되는 사례

  1. 실시간 채팅
    간단한 구조의 채팅 애플리케이션에서 사용.
  2. 알림 시스템
    실시간 알림을 구현할 때, 서버 상태를 감지하는 데 활용.
  3. 데이터 업데이트
    자주 업데이트되지 않는 데이터를 필요할 때 가져오는 애플리케이션.

 CDN(Content Delivery Network) : 

    CDN은 글로벌 분산 서버 네트워크로, 콘텐츠를 더 빠르고 효율적으로 제공하기위해 만들어졌습니다.

 

CDN을 활용해 외부 라이브러리를 불러오는 방식:

<!-- Socket.IO를 CDN에서 로드 -->
<script src="https://cdn.socket.io/socket.io-3.0.1.min.js"></script>

이 코드는 브라우저에서 Socket.IO 클라이언트 라이브러리를 실행하기 위해 CDN을 통해 라이브러리를 로드합니다. 

 

🔷CDN을 실시간 서비스(채팅, 게임 등)에 사용하는 이유

1. 콘텐츠 전송 가속화  
   - 사용자와 가까운 캐시 서버를 활용해 지연 시간을 최소화.
   - 전 세계 동시 접속 환경에서도 안정적인 연결 유지.

2. 서버 부하 분산 
   - 데이터 분산으로 특정 서버의 과부하 방지.
   - 트래픽 스파이크에도 원활히 서비스 제공.
3. 안정성과 가용성 향상 
   - 네트워크 장애 시 대체 서버로 서비스 지속.
   - 자동 복구 및 로드 밸런싱 기능으로 안정성 보장.
4. 빠른 로딩 시간 및 비용 절감 
   - 정적 콘텐츠 캐싱으로 요청 처리 속도 향상.
   - 서버 자원 절약과 비용 효율 극대화.
5. 보안 강화
   - DDoS 방어 및 데이터 암호화를 통해 보안 위협 차단.
   - 안전한 데이터 전송 환경 제공.

🔷CDN 활용하는 서비스

1. 팅 시스템
  - 메시지 기록 저장 및 정적 리소스(스크립트 등) 캐싱.
2. 티플레이어 게임
  - 클라이언트 업데이트, 맵·캐릭터 데이터의 신속한 전달.
3. 디어 스트리밍
  - 음성/영상 콘텐츠를 분산하여 지연 감소 및 품질 유지.
4.  리플레이/하이라이트
  - 클립 데이터를 캐싱하여 빠르게 로드 가능.
5.정적 파일 제공

     HTML, CSS, JS 등 정적 리소스 신속 제공.  
    htps://cdn.socket.io/socket.io-3.0.1.min.js 
6. 로벌 웹사이트 운영

    지리적으로 분산된 사용자에게 동일한 속도로 콘텐츠 제공.  
7. 보안 서비스 

    DDoS 방어와 SSL/TLS 지원을 통한 안전성 강화.

🔷대표적인 CDN 제공 업체

  • Cloudflare: 보안과 속도 최적화에 강점.
  • AWS CloudFront: Amazon Web Services에서 제공하는 고성능 CDN.
  • Akamai: 전 세계적인 네트워크 커버리지 제공.
  • Google Cloud CDN: 구글 클라우드와 연동.
  • Microsoft Azure CDN: Azure 서비스와 통합.

참고

1. Socket.IO의 설정 방법, 실시간 통신의 기본 개념 https://socket.io/docs/v4/

2. Socket.IO 버전별 경로 https://cdnjs.com/libraries/socket.io

3. Socket.IO 사용 해보기 https://inpa.tistory.com/entry/SOCKET-%F0%9F%93%9A-SocketIO-%EC%82%AC%EC%9A%A9-%ED%95%B4%EB%B3%B4%EA%B8%B0  

4. Socket.IO 예제와 정리 https://smaivnn.tistory.com/2

5. 웹소켓 깃허브 https://github.com/websockets/ws

6. 소켓.io 깃허브 https://github.com/socketio/socket.io

 


 

※ 기억할 것

◆  Socket.IO의 주요 특징

  1. 양방향 통신
    • 실시간 데이터 전송 가능 (응답 대기 불필요).
  2. 이벤트 기반 구조
    • 메시지 전송과 동작을 이벤트로 처리.
  3. 브라우저 호환성
    • WebSocket 미지원 환경에서는 Long Polling 등을 자동 사용.
    • 자동 재연결 및 연결 안정성 강화.
  4. 안정성
    • 하트비트, 자동 재연결, 패킷 버퍼링 제공.
  5. 확장성
    • 채팅, 알림, 멀티플레이어 게임 등에서 활용 가능.

'TIL,WIL' 카테고리의 다른 글

DNS  (1) 2024.12.18
some(), 정규식  (0) 2024.12.17
wil - 12.13  (0) 2024.12.13
TIL 241213  (1) 2024.12.13
TIL241212  (0) 2024.12.12