본문 바로가기
C.W.K.
Stream
Lesson 01 of 08 · published

첫 WebSocket 엔드포인트

~12 min · fastapi, server, accept

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

일곱 줄로 만드는 서버

FastAPI 는 @app.websocket 데코레이터로 WebSocket 엔드포인트를 열어. 처리기는 WebSocket 인자 하나를 받는 코루틴이야. 세 단계가 순서대로 일어나야 해. await websocket.accept() 로 핸드셰이크를 끝내고, 반복문 안에서 await websocket.receive_*() 로 받은 뒤, await websocket.send_*() 로 응답해.

accept() 는 선택 사항이 아니야

accept() 를 호출하기 전에는 핸드셰이크가 끝나지 않아 모든 전송이 오류를 일으켜. 반대로 accept 를 호출하지 않는 것 도 인증 검사 중 연결을 거절하는 방법이야. accept 뒤에는 연결이 완전히 열리고 프레임이 흐르기 시작해.

실행하고 시험하기

uvicorn 으로 서버를 띄우고 명령줄에서는 websocat 이나 wscat 으로 시험할 수 있어. cwkPippa 는 일부러 --reload 없이 Uvicorn 을 실행해. 피파 어댑터가 살아 있는 브레인 스템이라 다시 불러오면 세션이 끊기기 때문이지. 학습용 서버에서는 --reload 를 써도 돼.

Code

일곱 줄짜리 에코 서버·python
from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket('/ws')
async def echo(websocket: WebSocket):
    await websocket.accept()
    while True:
        text = await websocket.receive_text()
        await websocket.send_text(f'echo: {text}')
실행하고 시험하기·shell
pip install 'fastapi[standard]' uvicorn

# Run
uvicorn main:app --reload --host 0.0.0.0 --port 8000

# Test from a second terminal
brew install websocat   # or: cargo install websocat
websocat ws://localhost:8000/ws
> hello
echo: hello

External links

Exercise

에코 서버를 만들어. 브라우저 탭에서 new WebSocket('ws://localhost:8000/ws') 로 연결하고 메시지 세 개를 보내 응답을 확인해. 그런 다음 await websocket.accept() 를 주석 처리하고 어떤 일이 일어나는지 살펴본 뒤 서버가 기록한 정확한 오류 메시지를 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.