sword_game/README.md
2026-02-17 15:22:00 +00:00

2.4 KiB

C++20 Sword Game Server

Boost.Asio와 MySQL을 활용한 간단한 소켓 게임 서버 프로젝트입니다.

주요 기능

  • C++20: jthread, stop_token, 코루틴(co_await) 사용
  • 네트워크: Boost.Asio 기반 비동기 I/O 처리
  • 데이터베이스: MySQL 연동을 통한 유저 데이터 영속성 관리
  • 동기화: strand 및 비동기 락을 이용한 자원 보호
  • 도커: Docker Compose를 이용한 서버 및 DB 환경 자동 구성

사전 요구 사항

  • g++ 14 or higher (C++20 support)
  • CMake 3.20+
  • Boost 1.83+
  • OpenSSL
  • MySQL/MariaDB Client

실행 방법

Docker 사용

데이터베이스와 서버를 한 번에 실행합니다.

docker compose up -d

로컬 빌드

# 빌드 환경 설정
./setup.sh

# 컴파일
cmake --build build

# 서버 실행
./build/Server

아키텍처 구성

  • NetworkService: io_context 관리
  • Session: 개별 클라이언트 비동기 수신/송신 처리
  • PacketHandler: 패킷 ID별 로직 디스패칭
  • SessionManager: 글로벌 세션 관리 및 브로드캐스팅
  • DatabaseManager: 비동기 데이터베이스 작업 및 락 제어
  • Packet: Protobuf 기반 직렬화 프로토콜 (proto/Protocol.proto)
flowchart TD
    Client("Python GUI Client") <-->|"Protobuf (Packet)"| NetworkService

    subgraph Server ["C++20 Sword Game Server"]
        NetworkService["NetworkService(io_context)"]
        SessionManager["SessionManager(글로벌 세션 관리 및 브로드캐스팅)"]
        Session["Session(개별 클라이언트 비동기 송수신)"]
        PacketHandler["PacketHandler(패킷 ID별 로직 디스패칭)"]
        DatabaseManager["DatabaseManager(비동기 DB 작업 및 락 제어)"]

        NetworkService -->|"Connection Accept"| Session
        SessionManager -.->|"Manage & Broadcast"| Session
        Session <-->|"Dispatch / Response"| PacketHandler
        PacketHandler <-->|"Request DB Operation"| DatabaseManager
        PacketHandler -->|"Broadcast Request"| SessionManager
    end

    DatabaseManager <-->|"SQL / 비동기 통신"| MySQL[(MySQL DB)]

Python GUI 클라이언트

README.md

TODO: 개선 사항

  • DB Connection Pool 도입
    • 기능은 구현 완료, DB 커넥션 늘려서 테스트 필요 (headless client?)
  • 검색 조회 기능 추가 (Mysql Full Text Search)
  • big endian 강제되게 수정