[게임 서버] 5.7 게임 플레이 이외의 네트워킹

게시:     수정

카테고리:

태그:

📦 5. 게임 네트워킹

👉🏻 7. 게임 플레이 이외의 네트워킹

💡 개발 팁

시퀀스 다이어그램을 그리며 개발하는 것이 좋다


🔐 로그온 과정

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
sequenceDiagram
  Participant C as 클라이언트
  Participant S as 서버
  Participant D as 데이터베이스

  C->>S: ① RequestLogon()
  activate S
  deactivate S

  S->>D: ② get user id/pw()
  activate D
  deactivate D

  D->>S: ③ user id/pw()
  activate S
  deactivate S

  S->>C: ④ Logon ok/fail()
  activate C
  deactivate C

  S->>D: ⑤ get player data()
  activate D
  deactivate D

  D->>S: ⑥ player data()
  activate S
  deactivate S

과정:

  1. 로그온 요청 메시지를 서버로 전송
  2. 서버는 파일이나 데이터베이스에서 해당 유저의 ID와 비밀번호를 받아서 식별
  3. 식별 결과를 클라이언트에 통보
  4. 성공 시 플레이어 정보를 데이터베이스에서 로딩해 게임 서버 메모리에 보관

👤 캐릭터 생성/선택 과정

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
sequenceDiagram
  Participant C as 클라이언트
  Participant S as 서버
  Participant D as 데이터베이스

  C->>S: ① RequestCreateCharacter()
  activate S
  deactivate S

  S->>D: ② insert character record()
  activate D
  deactivate D

  D->>S: ③ insert ok()
  activate S
  deactivate S

  S->>C: ④ NotifyCharacter<br>CreateSuccess/Fail()
  activate C
  deactivate C

  C->>S: ⑤ RequestSelectCharacter()
  activate S
  deactivate S

  S->>D: ⑥ update character<br>selection record()
  activate D
  deactivate D

  S->>C: ⑦ NotifySelectCharacter<br>Success/Fail()
  activate C
  deactivate C

생성 과정:

  1. 클라이언트는 서버에 캐릭터 생성 요청
  2. 서버는 데이터베이스에 새 캐릭터 개체 생성 요청
  3. 데이터베이스는 서버에 생성 요청 성공 여부 반환 (동일 캐릭터가 있으면 실패)
  4. 서버는 클라이언트에 성공 여부 통지

선택 과정:

  1. 클라이언트는 서버에 캐릭터 선택 요청
  2. 서버는 데이터베이스에 캐릭터 선택 기록 (존재하는 정보 기반이라 즉시 성공)
  3. 서버는 클라이언트에 캐릭터 선택 성공 여부 반환

🎮 매치메이킹

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
sequenceDiagram
  Participant C1 as 클라이언트 1
  Participant S as 서버
  Participant C2 as 클라이언트 2

  C1->>S: ① 방 생성 요청
  activate S
  deactivate S

  S->>C1: ② 방 생성 성공 여부 통지
  activate C1
  deactivate C1

  S->>C2: ③ 누군가 방을 만듬
  activate C2
  deactivate C2

  C2->>S: ④ 방 참여 요청
  activate S
  deactivate S

  S->>C2: ⑤ 방 참여 성공 여부 통지
  activate C2
  deactivate C2

  S->>C1: ⑥ 누군가 방에 들어왔다고 통지
  activate C1
  deactivate C1

  C1->>S: ⑦ 게임 시작 요청
  activate S
  deactivate S

  S->>C2: ⑧ 게임 시작 통지
  activate C2
  deactivate C2

  S->>C1: ⑨ 게임 시작 통지
  activate C1
  deactivate C1

핵심 원칙:

  • 방 입장/목록은 클라이언트가 아닌 서버에서 판단
  • 클라이언트는 서버에게 요청하고 결과에 따라 행동
  • 서버는 요청 판단 후 영향받는 모든 클라이언트에게 통보

🎁 아이템 사용

---
config:
  look: handDrawn
  theme: dark
  layout: dagre
---
flowchart TB

subgraph Server[서버]
    S1([유효한 플레이어인가?])
    S2([플레이어가 해당 아이템을 갖고 있는가?])
    S3(["아이템 개수를 1개 줄인다"])
    S4(["'아이템 개수가 N개가 되었다.'를 송신"])
    S5(["플레이어의 상태를 변경"])
    S6(["플레이어의 상태 XX가 OO로 바뀌었음을 송신"])

    S1 --> S2
    S2 --> S3
    S3 --> S4
    S4 --> S5
    S5 --> S6
end

C2 --> S1
S4 --> C3
S6 --> C4

subgraph Client[클라이언트]
    C1([아이템 클릭])
    C2(["'아이템을 사용하라.' 를 서버에 송신"])
    C3(["해당 아이템의 개수를 N으로 변경"])
    C4(["플레이어의 상태를 변경"])

    C1 --> C2
end

과정:

  1. 클라이언트는 서버에게 아이템ID를 담은 메시지 전송
  2. 서버는 플레이어 사용 가능 여부 판단 후 사용 결과 판정
  3. 서버는 클라이언트에게 아이템 사용됨 통지

🧐 정리

공통 패턴:

  • 클라이언트 → 서버: 요청
  • 서버: 검증 및 판단
  • 서버 → 클라이언트(들): 결과 통보
  • 모든 중요한 판단은 서버에서 수행

GameServer 카테고리 내 다른 글 보러가기

댓글남기기