websocket: 클라이언트-서버의 양방향 통신
Websockets
클라이언트(브라우저)와 서버 간의 실시간 양방향 통신을 가능하게 하는 프로토콜 WebSocket
HTTP 프로토콜과의 차이는?
HTTP 프로토콜은 요청(request)에 응답(response)을 주면 연결이 끊긴다. 반면, websocket은 연결을 지속적으로 유지할 수 있기 때문에 실시간 통신이 가능하다.
작동 원리
- 클라이언트가 HTTP프로토콜을 사용해 websocket handshake 요청을 서버로 전송
- handshake가 종료되면 HTTP에서 WebSocket 프로토콜로 전환하는 ‘Protocol Swtiching’ 진행, 새로운 소켓 생성
ws://
: 일반 WebSocketwss://
: SSL을 사용한 보안 WebSocket (HTTPS와 유사하게 암호화됨)
- 서버와 클라이언트가 실시간 양방향 통신을 수행
- 이벤트 발생에 따라 클라이언트나 서버가 연결을 종료
예제
server.py
import websockets
import asyncio
async def hello(websocket, path):
name = await websocket.recv()
print(f"< {name}")
greeting = f"안녕하세요, {name}!"
await websocket.send(greeting)
print(f"> {greeting}")
async def main():
async with websockets.serve(hello, '0.0.0.0', 8765):
await asyncio.Future()
if __name__ == '__main__':
asyncio.run(main())
client.py
import websockets
import asyncio
async def hello():
uri = "ws://0.0.0.0:8765"
async with websockets.connect(uri) as websocket:
name = input('what is your name? ')
await websocket.send(name)
print(name)
greeting = await websocket.recv()
print(greeting)
if __name__ == '__main__':
asyncio.run(hello())
server.py
를 실행한다client.py
를 실행한다- 클라이언트가 이름[입력 내용]을 서버에 전달한다
- 이름[입력 내용]을 전달 받은 서버가 인사말을 붙여 클라이언트에 전달한다
- 인사말+이름을 전달받은 클라이언트가 내용을 출력한다
클라이언트 종료. 서버는 유지된다.