유니티 엔진 - 게임 프로젝트/데디케이트 기반 모바일 게임

서버 - 1) 서버 구조 설계

monstro 2025. 11. 18. 11:48
728x90
반응형

- 개요

 

위의 패키지를 사용하여 서버의 구조를 설계한다

그리고 클라이언트로부터 전달받은 패킷분해하여 데이터를 추출하는 방식을 구성한다

 

- 서버 사이드

1) Container 클래스

 

Container 클래스.Net 애플리케이션이 동작하기 위한 서비스를 설정하는 작업을 수행한다

 

 

Configure 함수에서는 서비스의 정의를 담을 ServiceCollection을 생성하고,

생성한 인스턴스를 ConfigureServices 함수에 매개변수로 넘겨준다

이후 ServiceCollection 인스턴스로부터 BuildServiceProvider 함수를 호출하여

객체의 생성의존성 주입을 자동으로 수행하는 DI 컨테이너를 생성한다

 

 

ConfigureServices 함수인자로 받은 IServiceCollection을 사용하여 동작한다

AddLogging 함수를 호출하여 로깅 서비스를 등록하고,

NetworkServer 클래스와 PacketRegistry 클래스를 대상으로 싱글톤을 생성하여 관리한다

 

2) PacketRegistry 클래스

 

PacketRegistry 클래스네트워크 통신에서 사용하는 패킷의 타입을 관리하고 등록하는 역할을 수행한다

멤버변수의 구성은 위와 같다

  • _packetTypes 딕셔너리 : 패킷의 타입인 PacketTypeKey로, 패킷을 구현하는 클래스의 TypeValue로 저장
  • PacketTypes 프로퍼티 : _packetTypes가 초기화되지 않았다Initialize 함수를 호출하고, 아니라면 반환

 

 

Initialize 함수를 호출하여 리플렉션을 통해 패킷 등록 작업을 자동화한다

로직은 다음과 같다

우선, 현재 어플리케이션의 모든 클래스 타입에서 INetPacket을 상속받아 구현한 타입을 가져온다

가져온 패킷 타입을 순회하면서 리플렉션을 사용하여 해당 패킷 타입임시 인스턴스를 생성한다

생성한 인스턴스의 TypeKey로, 순회중인 패킷 타입Value로 _packetTypes에 저장한다

 

3) NetworkServer 클래스

 

멤버변수에 위와 같이 ILoggerIServiceProvider를 추가한다

또, 생성자에서 추가한 멤버변수들의 타입을 매개변수로 받아 멤버변수를 설정한다

따라서 생성자 주입을 통해 로깅 기능DI 컨테이너 접근 권한을 부여한다

 

 

클라이언트로부터 데이터를 받은 경우 호출하는 OnNetworkReceive 함수를 위와 같이 수정한다

CreateScope 함수를 호출하여 패킷을 처리하는 서비스 스코프를 생성한다

이후의 로직은 다음과 같다

  • 예외가 발생하지 않은 경우
    • 패킷의 첫번째 바이트를 읽어 패킷의 타입을 파악
    • 타입이 파악된 패킷을 역직렬화하고 데이터로 채워진 패킷 반환
    • Recycle 함수를 호출하여 Reader 객체 재사용
  • 예외가 발생한 경우 : 로깅을 통해 에러를 표현

 

 

RessolvePacket 함수의 로직은 다음과 같다

주입된 DI 컨테이너를 통해 PacketRegistry 싱글톤을 가져와 저장한다

저장한 싱글톤의 PacketTypes를 탐색하여 전달받은 패킷 클래스의 Type 정보를 가져와 저장한다

리플렉션을 통해 저장한 패킷 클래스의 Type 정보를 기반으로 INetPacket 인스턴스를 생성한다

이후 생성한 인스턴스를 역직렬화하여 데이터를 패킷에 저장하고 패킷을 반환한다

 

4) Program 클래스

 

Program 클래스를 위와 같이 수정하여

서비스 컨테이너를 생성하고 생성한 서비스 컨테이너로부터 NetworkServer 싱글톤을 가져온다

가져온 싱글톤을 통해 서버를 시작한다

 

- 최종 실행 결과

 

728x90
반응형