Python을 사용하여 WebSocket 이해하기

WBOY
풀어 주다: 2024-09-10 06:01:02
원래의
1017명이 탐색했습니다.

Understanding WebSockets using Python

소개

실시간 소통이 중요한 오늘날의 디지털 환경에서. 기존 HTTP는 요청-응답 모델과 고유한 대기 시간으로 인해 부족합니다. 실시간 재고 업데이트, 멀티플레이어 게임, 협업 도구 등 비즈니스와 애플리케이션에서 즉각적인 데이터 전송을 점점 더 요구함에 따라 WebSocket은 판도를 바꾸는 기술로 등장했습니다. HTTP와 달리 WebSocket은 전이중 양방향 통신을 지원하므로 서버와 클라이언트 모두 단일 영구 연결을 통해 실시간으로 메시지를 보내고 받을 수 있습니다. 이는 오버헤드를 줄일 뿐만 아니라 웹 애플리케이션의 성능과 응답성을 크게 향상시킵니다.

WebSocket이란

WebSocket은 단일 장기 TCP 연결을 통해 전이중 통신 채널을 제공하는 통신 프로토콜입니다. 이는 클라이언트와 서버 사이에 WebSocket 연결이 설정되면 두 당사자가 연결을 다시 열 필요 없이 동시에 지속적으로 데이터를 보내고 받을 수 있음을 의미합니다. WebSocket은 효율적이고 지연 시간이 짧도록 설계되어 실시간 애플리케이션에 이상적입니다.

왜 WebSocket을 사용해야 할까요?

WebSocket은 클라이언트와 서버 간의 실시간 통신이 필요한 시나리오에서 사용됩니다. 클라이언트가 모든 요청을 시작해야 하는 요청-응답 모델을 따르는 기존 HTTP와 달리 WebSocket은 양방향 통신을 허용합니다. 따라서 WebSocket은 클라이언트가 요청할 필요 없이 실시간으로 서버에서 클라이언트로 데이터를 푸시해야 하는 애플리케이션에 특히 유용합니다.

실제 사용 사례

  • 채팅 애플리케이션: WebSocket은 지연 없이 실시간으로 메시지를 보내고 받아야 하는 채팅 애플리케이션에 일반적으로 사용됩니다.
  • 라이브 스트리밍: WebSocket을 사용하여 라이브 비디오 또는 오디오를 스트리밍할 수 있으므로 서버는 새로운 콘텐츠가 제공될 때 클라이언트에 푸시할 수 있습니다.
  • 협업 플랫폼: Google Docs와 같은 공동 작업 도구에서 WebSocket을 사용하면 여러 사용자가 페이지를 새로 고치지 않고도 다른 사용자가 변경한 내용을 실시간으로 볼 수 있습니다.

WebSocket과 HTTP

커뮤니케이션 모델

  • HTTP: 클라이언트가 요청을 시작하고 서버가 응답하는 요청-응답 모델을 따릅니다. 응답 후 연결이 종료됩니다.
  • WebSockets: WebSocket은 클라이언트와 서버 모두 매번 연결을 다시 열지 않고도 지속적으로 데이터를 보내고 받을 수 있는 장기 전이중 연결을 제공합니다.

연결 처리

  • HTTP: 각 요청은 새로운 연결을 열고, 응답 후 연결이 닫힙니다.
  • WebSocket: 초기 핸드셰이크(HTTP 사용) 후에는 연결이 열린 상태로 유지되므로 연결을 다시 설정할 필요 없이 실시간 통신이 가능합니다.

효율성

  • HTTP: 요청이 자주 발생하지 않는 일회성 통신이나 거래에 적합합니다. 무상태(Stateless)이므로 지속적인 통신을 위해 롱 폴링과 같은 기술이 사용되며 이는 리소스 집약적일 수 있습니다.
  • WebSocket: WebSocket은 연결이 열려 있으므로 실시간 및 양방향 통신에 효율적입니다. 롱 폴링과 같은 기술에 비해 더 적은 리소스를 사용합니다.

지연

  • HTTP: 클라이언트가 요청해야 하고 서버가 응답해야 하기 때문에 항상 지연(대기 시간)이 있습니다. 이는 실시간 사용 사례에는 비효율적입니다.
  • WebSockets: 연결이 설정된 후 클라이언트와 서버 간에 데이터가 거의 즉시 흐를 수 있으므로 대기 시간이 줄어들고 실시간 애플리케이션에 이상적입니다.

사용 사례

  • HTTP: 클라이언트가 요청을 시작하는 기존 웹 애플리케이션(예: REST API)에 가장 적합합니다.
  • WebSockets: 채팅 앱, 주식 거래 플랫폼, 라이브 대시보드, 온라인 게임과 같은 실시간 애플리케이션에 이상적입니다.

웹소켓의 장점

  1. 실시간 통신: WebSocket은 지연 시간이 짧은 실시간 통신을 지원하므로 즉각적인 업데이트가 필요한 애플리케이션에 이상적입니다.
  2. 양방향 데이터 흐름: 서버가 클라이언트가 시작한 요청에만 응답할 수 있는 HTTP와 달리 클라이언트와 서버 모두 언제든지 데이터를 보내고 받을 수 있습니다.
  3. 오버헤드 감소: WebSocket은 연결을 열린 상태로 유지함으로써 새로운 HTTP 연결을 반복적으로 설정해야 하는 필요성을 줄여 대역폭을 절약하고 대기 시간을 줄입니다.
  4. 효율성: WebSocket은 지속적인 데이터 전송을 위해 긴 폴링이나 HTTP 요청에 비해 더 적은 리소스를 사용합니다.
  5. 확장성: WebSocket은 많은 동시 연결을 효율적으로 처리할 수 있으므로 확장 가능한 실시간 애플리케이션에 적합합니다.

WebSocket 작동 방식

  1. 핸드셰이크: WebSocket 연결은 HTTP 핸드셰이크로 시작됩니다. 클라이언트는 연결 프로토콜을 HTTP에서 WebSocket으로 전환하기 위해 업그레이드 헤더와 함께 서버에 요청을 보냅니다.
  2. 연결 설정됨: 핸드쉐이크 후 연결이 설정됩니다. 서버와 클라이언트는 지속적으로 개방형 TCP 연결을 유지합니다.
  3. 전이중 통신: WebSocket 연결이 열리면 데이터를 동시에 주고받을 수 있습니다. 서버와 클라이언트 모두 언제든지 통신을 시작할 수 있습니다.
  4. 연결 닫기: 더 이상 필요하지 않은 경우 서버나 클라이언트가 연결을 끊을 수 있습니다. 이렇게 하면 세션이 종료되고 리소스가 해제됩니다.

WebSocket 사용 사례

  1. 채팅 애플리케이션: WhatsApp 및 Slack과 같은 인스턴트 메시징 서비스는 사용자 간의 실시간 메시징을 위해 WebSocket을 사용합니다.
  2. 라이브 업데이트: WebSocket은 금융 거래 플랫폼(주가), 스포츠 경기 결과, 라이브 뉴스 피드 등의 애플리케이션에서 실시간 데이터 업데이트를 지원합니다.
  3. 협업 도구: WebSocket을 사용하면 여러 사용자가 동시에 문서를 편집할 수 있는 Google Docs 또는 Figma와 같은 공동 작업 도구에서 실시간 업데이트가 가능합니다.
  4. 온라인 게임: 멀티플레이어 게임은 실시간 플레이어 작업 및 상호 작용을 위해 WebSocket을 사용합니다.
  5. IoT 및 센서 데이터: 실시간 데이터 스트리밍 기능이 있는 장치(예: IoT 장치, 날씨 센서)는 WebSocket을 사용하여 지속적인 업데이트를 보냅니다.

Python과 WebSocket을 사용하여 실시간 애플리케이션 구축

Python(FastAPI 사용) 및 Streamlit과 함께 WebSocket을 사용하여 실시간 애플리케이션을 구축해 보겠습니다.

1. FastAPI WebSocket 서버 설정

이 코드는 FastAPI를 사용하여 WebSocket 서버를 설정합니다.

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from typing import List

app = FastAPI()

class ConnectionManager:
    def __init__(self):
        self.active_connections: List[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)

    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)

    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)

manager = ConnectionManager()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await manager.broadcast(f"Message: {data}")
    except WebSocketDisconnect:
        manager.disconnect(websocket)
로그인 후 복사

이 WebSocket 서버는 여러 연결을 처리하고 연결된 모든 클라이언트에 메시지를 브로드캐스트할 수 있습니다.

2. 간소화된 프론트엔드

이제 WebSocket 서버에 연결하고 실시간 업데이트를 수신하는 Streamlit을 사용하여 실시간 애플리케이션을 구축해 보겠습니다.

import streamlit as st
import asyncio
import websockets

async def websocket_receive():
    uri = "ws://localhost:8000/ws"
    async with websockets.connect(uri) as websocket:
        while True:
            message = await websocket.recv()
            st.write(f"Received: {message}")

st.title("Real-Time WebSocket Client")

if st.button("Connect to WebSocket"):
    st.write("Connected!")
    asyncio.run(websocket_receive())
로그인 후 복사

설명: 사용자가 "WebSocket에 연결" 버튼을 클릭하면 Streamlit 프런트엔드는 WebSocket 서버와 연결을 설정하고 메시지를 수신합니다.

3. 애플리케이션 실행

FastAPI 서버 실행:

uvicorn server:app --reload
로그인 후 복사

Streamlit 앱 실행:

streamlit run your_script.py
로그인 후 복사

실시간 커뮤니케이션의 주요 단계:

  • WebSocket 설정: WebSocket 서버가 실행되고 연결을 수락합니다.
  • Streamlit 연결: Streamlit 프런트엔드는 WebSocket 서버에 대한 연결을 시작합니다.
  • 전이중 통신: 클라이언트(Streamlit)와 서버(FastAPI) 모두 실시간으로 메시지를 주고받을 수 있습니다.

위 내용은 Python을 사용하여 WebSocket 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!