- 개요

위의 패키지를 사용하여 서버의 구조를 설계한다
그리고 클라이언트로부터 전달받은 패킷을 분해하여 데이터를 추출하는 방식을 구성한다
- 서버 사이드
1) Container 클래스

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

Configure 함수에서는 서비스의 정의를 담을 ServiceCollection을 생성하고,
생성한 인스턴스를 ConfigureServices 함수에 매개변수로 넘겨준다
이후 ServiceCollection 인스턴스로부터 BuildServiceProvider 함수를 호출하여
객체의 생성과 의존성 주입을 자동으로 수행하는 DI 컨테이너를 생성한다

ConfigureServices 함수는 인자로 받은 IServiceCollection을 사용하여 동작한다
AddLogging 함수를 호출하여 로깅 서비스를 등록하고,
NetworkServer 클래스와 PacketRegistry 클래스를 대상으로 싱글톤을 생성하여 관리한다
2) PacketRegistry 클래스

PacketRegistry 클래스는 네트워크 통신에서 사용하는 패킷의 타입을 관리하고 등록하는 역할을 수행한다
멤버변수의 구성은 위와 같다
- _packetTypes 딕셔너리 : 패킷의 타입인 PacketType을 Key로, 패킷을 구현하는 클래스의 Type을 Value로 저장
- PacketTypes 프로퍼티 : _packetTypes가 초기화되지 않았다면 Initialize 함수를 호출하고, 아니라면 반환

Initialize 함수를 호출하여 리플렉션을 통해 패킷 등록 작업을 자동화한다
로직은 다음과 같다
우선, 현재 어플리케이션의 모든 클래스 타입에서 INetPacket을 상속받아 구현한 타입을 가져온다
가져온 패킷 타입을 순회하면서 리플렉션을 사용하여 해당 패킷 타입의 임시 인스턴스를 생성한다
생성한 인스턴스의 Type을 Key로, 순회중인 패킷 타입을 Value로 _packetTypes에 저장한다
3) NetworkServer 클래스

멤버변수에 위와 같이 ILogger와 IServiceProvider를 추가한다
또, 생성자에서 추가한 멤버변수들의 타입을 매개변수로 받아 멤버변수를 설정한다
따라서 생성자 주입을 통해 로깅 기능과 DI 컨테이너 접근 권한을 부여한다

클라이언트로부터 데이터를 받은 경우 호출하는 OnNetworkReceive 함수를 위와 같이 수정한다
CreateScope 함수를 호출하여 패킷을 처리하는 서비스 스코프를 생성한다
이후의 로직은 다음과 같다
- 예외가 발생하지 않은 경우
- 패킷의 첫번째 바이트를 읽어 패킷의 타입을 파악
- 타입이 파악된 패킷을 역직렬화하고 데이터로 채워진 패킷 반환
- Recycle 함수를 호출하여 Reader 객체 재사용
- 예외가 발생한 경우 : 로깅을 통해 에러를 표현

RessolvePacket 함수의 로직은 다음과 같다
주입된 DI 컨테이너를 통해 PacketRegistry 싱글톤을 가져와 저장한다
저장한 싱글톤의 PacketTypes를 탐색하여 전달받은 패킷 클래스의 Type 정보를 가져와 저장한다
리플렉션을 통해 저장한 패킷 클래스의 Type 정보를 기반으로 INetPacket 인스턴스를 생성한다
이후 생성한 인스턴스를 역직렬화하여 데이터를 패킷에 저장하고 패킷을 반환한다
4) Program 클래스

Program 클래스를 위와 같이 수정하여
서비스 컨테이너를 생성하고 생성한 서비스 컨테이너로부터 NetworkServer 싱글톤을 가져온다
가져온 싱글톤을 통해 서버를 시작한다
- 최종 실행 결과

'유니티 엔진 - 게임 프로젝트 > 데디케이트 기반 모바일 게임' 카테고리의 다른 글
| 사용자 인증 - 1) 사용자 저장 (0) | 2025.12.01 |
|---|---|
| 서버 - 최종) 서버의 패킷 처리 구조 설계 (0) | 2025.11.18 |
| 로그인 처리 - 최종) 로그인을 통한 클라이언트 -> 서버로의 패킷 전송 (0) | 2025.11.17 |
| 로그인 처리 - 1) 로그인 UI 구성 (0) | 2025.11.11 |
| 프로젝트 세팅 - 2) LiteNetLib를 활용한 클라이언트 + 서버 구현 (0) | 2025.11.04 |