이 프로젝트는 Python의 websockets 라이브러리와 asyncio를 활용한 웹소켓 서버 및 클라이언트를 구현했습니다. 30초 간격의 ping/pong 메커니즘을 통해 연결 상태를 유지하는 안정적인 통신을 제공합니다.
- 비동기 통신 (asyncio)를 활용한 고성능 구현
- 30초 간격의 자동 ping/pong 메커니즘을 통한 연결 상태 모니터링
- 사용자 입력과 독립적으로 동작하는 ping/pong 처리
- 연결 상태 및 메시지 교환에 대한 상세 로깅
- 안정적인 오류 처리 및 연결 관리
- Python 3.7 이상
- websockets 라이브러리
- asyncio 모듈 (Python 3.4 이상에 내장)
pip install websockets서버는 다음 기능을 제공합니다:
- 다중 클라이언트 연결 관리
- 30초 간격의 ping 메시지 전송
- 클라이언트 ping에 대한 pong 응답
- 클라이언트와의 메시지 교환
ServerConnection: 개별 클라이언트 연결을 관리WebSocketServer: 서버 기능 및 연결 관리 기능 제공
클라이언트는 다음 기능을 제공합니다:
- 서버 연결 및 재연결 관리
- 30초 간격의 ping 메시지 전송
- 서버 ping에 대한 pong 응답
- 사용자 입력을 통한 메시지 전송
ClientConnection: 서버 연결을 관리WebSocketClient: 클라이언트 기능 제공
python websocket-server.py기본적으로 서버는 0.0.0.0:8765에서 실행됩니다.
python websocket-client.py기본적으로 클라이언트는 ws://localhost:8765에 연결을 시도합니다.
클라이언트를 실행하면 메시지 입력 프롬프트가 표시됩니다. 원하는 메시지를 입력하고 Enter 키를 누르면 서버로 전송됩니다.
전송할 메시지 (종료하려면 'exit' 입력):
'exit'를 입력하면 클라이언트가 종료됩니다.
WebSocketServer
├── __init__(host, port)
├── handler(websocket, path)
├── ping_handler(connection, client_id)
├── start_server()
└── main()
WebSocketClient
├── __init__(uri)
├── connect()
├── ping_handler()
├── message_handler()
├── user_input_handler()
├── send_message(message)
├── close()
├── run()
└── main()
- 서버와 클라이언트는 각각 30초 간격으로 ping 메시지를 전송합니다.
- 상대방은 ping 메시지를 받으면 자동으로 pong으로 응답합니다.
- ping에 대한 응답이 20초 내에 오지 않으면 연결 타임아웃이 발생합니다.
- ping/pong 교환은 로그에 기록되어 연결 상태를 모니터링할 수 있습니다.
이 구현은 다음과 같은 비동기 태스크를 사용합니다:
- 핑 전송 태스크 (
ping_handler) - 메시지 수신 태스크 (웹소켓 핸들러 내부)
- 핑 전송 태스크 (
ping_handler) - 메시지 수신 태스크 (
message_handler) - 사용자 입력 태스크 (
user_input_handler)
각 태스크는 독립적으로 실행되며, 다른 태스크의 블로킹 없이 자체 작업을 수행합니다.
서버와 클라이언트 모두 다음과 같은 오류 상황을 처리합니다:
- 연결 실패
- 연결 종료
- 핑/퐁 실패
- 메시지 송수신 실패
- 예기치 않은 예외
오류가 발생하면 적절한 로그 메시지가 표시되고, 필요한 경우 연결 재설정 또는 프로그램 종료가 수행됩니다.
logging 모듈을 사용하여 다양한 이벤트와 오류를 로깅합니다:
- 연결 설정/종료
- 핑/퐁 교환
- 메시지 송수신
- 오류 및 예외
로그 형식: 시간 - 로거이름 - 로그레벨 - 메시지