프로토콜은 컴퓨터 또는 전자 기기 간의 원활한 통신을 위해 지키기로 약속한 규약이고, 패킷은 네트워크를 통해 전송되는 형식화된 데이터 덩어리이다.
구글은 Protobuf 라는 오픈소스 프로토콜을 제공하고 있다. 이를 이용해 패킷의 생성을 자동화할 수 있다.
사용방법
각 패킷들에 대해 수행할 작업들을 매칭해주는 매니저 클래스이다.
스도코드
클래스 PacketManager (싱글톤)
{
멤버 변수:
- _instance: 싱글톤 인스턴스
- _onRecv: 패킷 ID와 해당 패킷을 처리하는 함수 매핑 (딕셔너리)
- _handler: 패킷 ID와 해당 핸들러 매핑 (딕셔너리)
- CustomHandler: 사용자 정의 패킷 핸들러
생성자:
- PacketManager():
- Register() 호출하여 패킷 등록
메서드:
- Register():
- 각 패킷 ID를 _onRecv 및 _handler에 등록
- 특정 패킷에 대한 처리 함수 매핑
- OnRecvPacket(PacketSession session, ArraySegment<byte> buffer):
- 버퍼에서 패킷 크기와 ID를 읽음
- 패킷 ID에 해당하는 처리 함수(_onRecv) 실행
- MakePacket<T>(PacketSession session, ArraySegment<byte> buffer, ushort id):
- T 타입의 패킷 객체 생성 및 데이터 파싱
- CustomHandler가 설정되어 있으면 실행
- 없으면 _handler에서 패킷 ID에 맞는 핸들러를 찾아 실행
- GetPacketHandler(ushort id):
- 패킷 ID에 해당하는 핸들러 반환 (없으면 null 반환)
}
각 패킷들이 수행할 작업들을 모아둔 클래스이다.
아래의 스도코드에 있는 함수들에 더해 필요한 기능들을 일일이 만들어줘야 한다.
스도코드
클래스 PacketHandler (정적 클래스)
{
정적 메서드:
- C_MoveHandler(PacketSession session, IMessage packet):
- 받은 패킷을 C_Move 타입으로 변환
- 세션을 ClientSession 타입으로 변환
- 플레이어 객체를 가져와 위치 이동 정보를 출력
- 플레이어와 게임 룸이 유효한 경우, 게임 룸에 이동 요청을 추가 (Push 호출)
- C_SkillHandler(PacketSession session, IMessage packet):
- 받은 패킷을 C_Skill 타입으로 변환
- 세션을 ClientSession 타입으로 변환
- 플레이어 객체를 가져와 스킬 사용 정보를 출력
- 플레이어와 게임 룸이 유효한 경우, 게임 룸에 스킬 사용 요청을 추가 (Push 호출)
- C_LoginHandler(PacketSession session, IMessage packet):
- 받은 패킷을 C_Login 타입으로 변환
- 세션을 ClientSession 타입으로 변환
- 로그인 처리 함수 호출 (HandleLogin)
- C_EnterGameHandler(PacketSession session, IMessage packet):
- 받은 패킷을 C_EnterGame 타입으로 변환
- 세션을 ClientSession 타입으로 변환
- 게임 입장 처리 함수 호출 (HandleEnterGame)
- C_CreatePlayerHandler(PacketSession session, IMessage packet):
- 받은 패킷을 C_CreatePlayer 타입으로 변환
- 세션을 ClientSession 타입으로 변환
- 플레이어 생성 처리 함수 호출 (HandleCreatePlayer)
- C_EquipItemHandler(PacketSession session, IMessage packet):
- 받은 패킷을 C_EquipItem 타입으로 변환
- 세션을 ClientSession 타입으로 변환
- 플레이어 객체를 가져옴
- 플레이어와 게임 룸이 유효한 경우, 게임 룸에 아이템 장착 요청을 추가 (Push 호출)
- C_PongHandler(PacketSession session, IMessage packet):
- 세션을 ClientSession 타입으로 변환
- Pong 응답 처리 함수 호출 (HandlePong)
}