[Python] 웹소켓(Websocket)

류지수·2025년 3월 11일

개발일지

목록 보기
4/5

Websocket

클라이언트와 서버 간 양방향 실시간 통신을 가능하게 하는 프로토콜
HTTP와 달리 한 번 연결되면 꼐속 데이터를 주고 받을 수 있음

  • 풀 이중 통신(Full-Duplex) → 클라이언트와 서버가 동시에 데이터 주고받을 수 있음.
  • 실시간성 → 서버가 클라이언트 요청 없이도 바로 데이터를 보낼 수 있음.
  • HTTP보다 효율적 → 연결을 유지하면서 필요할 때만 데이터를 보내서 네트워크 오버헤드 줄일 수 있음.

설치 (python 기준)

pip install websocket-client

예제 코드

import websocket
import rel

def on_message(ws, message):
    print(f"받은 메시지: {message}")

def on_error(ws, error):
    print(f"에러 발생: {error}")

def on_close(ws, close_status_code, close_msg):
    print("연결 종료")

def on_open(ws):
    print("연결 성공")
    ws.send("Hello, WebSocket!")

ws = websocket.WebSocketApp(
    "wss://example.com/socket",
    on_message=on_message,
    on_error=on_error,
    on_close=on_close
)

ws.on_open = on_open
ws.run_forever(dispatcher=rel, reconnect=5, ping_interval=60)
rel.signal(2, rel.abort)  # Ctrl+C로 종료
rel.dispatch()

상세보기

ws.run_forever(dispatcher=rel, reconnect=5, ping_interval=60)  
rel.signal(2, rel.abort)  # Keyboard Interrupt
rel.dispatch()
  • ws.run_forever(dispatcher=rel, reconnect=5, ping_interval=60)
    • 웹소켓을 무기한 실행(run_forever)하면서 rel(이벤트 루프 라이브러리)을 사용
    • connect=5: 연결이 끊어지면 5초 후 재연ㅇ결
    • ping_interval=60: 60초마다 핑(ping) 메시지를 보내서 연결을 유지.
  • rel.signal(2, rel.abort)
    • SIGINT (Ctrl+C)신호를 감지하면 웹소켓을 종료.
  • rel.dispatch()
    • rel 이벤트 루프를 시작해서 웹소켓이 정상적으로 작동하도록 함.

추가

  • run_forever() 대신 ws.run_forever(ping_interval=30, reconnect=10)과 같이 직접 설정 가능
  • reconnect를 설정하지 않으면 연결이 끊어졌을 때 자동으로 다시 연결되지 않음
  • ping_interval이 너무 길면 서버가 연결이 끊어졌다고 판단할 수 있음
profile
끄적끄적

0개의 댓글