WebSocket 개념과 통신 실습

2024. 7. 30. 10:58·WEB/etc

⚡ WebSocket

  • 서버와 클라이언트 간에 언제든 양방향 통신이 가능하도록 하는 기술

 

WebSocket 특징

  • 실시간, 양방향 및 지속적인 연결
  • 짧은 지연 시간의 데이터 교환
  • 실시간 채팅이나 게임에 적합
  • HTML5 표준 기술로 최신 브라우저의 경우 웹소켓 지원
  • 미지원 브라우저도 존재 - WebSocket Emulation으로 대체 (socket.io, SockJS)

 

WebSocket 통신 비교

기본적인  HTTP 통신 WebSocket
단방향 통신 양방향 통신
클라이언트가 요청을 보내면 서버가 응답 별도의 요청을 보내지 않고도 데이터 수신

 

기본적으로 HTTP 통신은 클라이언트가 요청(Request)을 보내면 서버가 응답(Response)하는 구조이다. 서버는 능동적으로 클라이언트에 먼저 데이터를 전송할 수 없기 때문에 클라이언트가 서버의 데이터를 얻기 위해 요청을 먼저 해야 한다. 서버는 이에 수동적으로 응답하는 구조이다.

 

반면에 웹소켓 통신은 클라이언트와 서버를 연결하고 실시간으로 통신이 가능하도록 하는 기술이다. HTTP와 다르게 별도의 요청을 보내지 않고도 데이터를 수신할 수 있다. 요청을 보낼 필요없이 바로 메시지를 수신할 수 있다. 이 프로토콜은 정보를 동시에 송수신할 수 있으므로 정보 교환이 더 빨라진다.

 

WebSocket 사용 예시

실시간 데이터 업데이트와 클라이언트 메시지 기능이 필요할 때 주로 사용한다.

- 교환 플랫폼, 게임 어플리케이션, 챗봇, 푸시 알림, 소셜 네트워크, 채팅 애플리케이션, IoT 애플리케이션 

 

🎈 실습

- Express, WebSocket 서버 설정

const express = require('express')
const { WebSocket } = require('ws')
const app = express()

app.listen(8000, () => {
    console.log('Server listening on port 8000')
})

const wss = new WebSocket.Server({ port: 8001 })

 

- 유저 접속

wss.on('connection', ws => {
    users.push(ws)
    broadcast(`새로운 유저 접속 [현재: ${users.length}명]`);
    // ...
})

1명 접속
2명 접속

 

- 채팅

ws.on('message', message => {
    broadcast(message)
})

 

- 유저 연결 해제

ws.on('close', () => {
    users = users.filter(user => user !== ws)
    broadcast(`유저 연결 해제 [현재: ${users.length}명]`);
})

 

💻 전체 코드

  • index.js
const express = require('express')
const { WebSocket } = require('ws')
const app = express()

app.use(express.static('front'))

app.listen(8000, () => {
    console.log('Server listening on port 8000')
})

// WebSocket 서버 인스턴스 생성
const wss = new WebSocket.Server({ port: 8001 })

// 현재 연결된 유저
let users = []

// 클라이언트가 서버에 연결
wss.on('connection', ws => {
    // 새로운 유저 접속
    users.push(ws)
    broadcast(`새로운 유저 접속 [현재: ${users.length}명]`); // 클라이언트에게 알림

    // 클라이언트가 메시지를 보냄
    ws.on('message', message => {
        broadcast(message)
    })

    // 유저 연결 종료
    ws.on('close', () => {
        users = users.filter(user => user !== ws)
        broadcast(`유저 연결 해제 [현재: ${users.length}명]`);
    })
})

const broadcast = (data) => {
    users.forEach((user) => {
        if (user.readyState === WebSocket.OPEN) {
            user.send(data.toString())
        }
    })
}
  • index.html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Websocket 실습</title>
    <style>
        p {
            margin: 0;
        }
        #chat {
            width: 350px;
            height: 200px;
            background-color: rgb(226, 226, 226);
            border-radius: 10px;
            padding: 30px;
            margin-bottom: 10px;
            text-align: left;
        }
        #nickname {
            width: 60px;
        }
        #message {
            width: 220px;
        }
    </style>
</head>
<body>
    <div align="center">
        <h1>WebSocket 실습</h1>
        <div id="chat"></div>
        <input type="text" id="nickname" placeholder="닉네임">
        <input type="text" id="message" placeholder="메시지를 입력하세요">
        <button id="send">전송</button>
    </div>
    <script>
        const ws = new WebSocket('ws://localhost:8001')

        ws.onmessage = e => {
            const chat = document.getElementById('chat');
            chat.innerHTML += `<p>${event.data}</p>`;
            chat.scrollTop = chat.scrollHeight;
        };

        document.getElementById('send').onclick = e => {
            const nickname = document.getElementById('nickname');
            const message = document.getElementById('message');
            const fullMessage = `${nickname.value}: ${message.value}`

            ws.send(fullMessage);

            nickname.value = '';
            message.value = '';
        };
    </script>
</body>
</html>

 


 

반응형

'WEB > etc' 카테고리의 다른 글

[Chrome] 개발자 도구 활용법  (2) 2024.06.26
'WEB/etc' 카테고리의 다른 글
  • [Chrome] 개발자 도구 활용법
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (144) N
      • SSAFY (10)
      • Algorithm (71) N
        • 이론 (5)
        • 백준 (BOJ) (65) N
        • 프로그래머스 (1)
      • Language (9)
        • JavaScript (0)
        • TypeScript (0)
        • Java (9)
        • Python (0)
      • Library & Runtime (15)
        • React (13)
        • Node.js (2)
      • Framework (9)
        • 이론 (2)
        • Next.js (3)
        • Vue (4)
      • DevOps (3)
        • Git (3)
      • WEB (17)
        • HTML (9)
        • error (6)
        • etc (2)
      • Computer (5)
        • 자격증 (2)
        • tip (2)
        • etc (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    SSAFYcial
    백준
    Next.js
    SSAFY
    티스토리챌린지
    React
    우선순위큐
    DP
    kakaomap
    오블완
    딕셔너리
    파이썬
    누적합
    dfs
    강의
    싸피
    해시
    알고리즘
    렌더링최적화
    자바
    bfs
    Error
    Java
    html5
    카카오맵
    github
    블록체인
    재귀
    vue
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
WebSocket 개념과 통신 실습
상단으로

티스토리툴바