패킷 직렬화
지난 시간에는 ClientSession 에서 패킷을 받을 때 패킷 종류에 따라 처리를 달리 하는 방식을 Switch 문으로 처리하였지만, 시간이 지나면서 패킷의 종류가 늘어날수록 비효율적인 구조가 되기에 이를 패킷의 형식에 맞게 처리해주는 구조로 변경해주었다.
🩺 Packet Manager 자동화
이제 지난 시간에 제작한 구조들을 자동화 코드로 변경하고자 한다.
📿 ManagerFormat 추가
자동화를 위해 PacketFormat에 managerFormat을 선언하고, 기존에 작업하던 코드들을 가져온다.
여기서 Register의 부분은 어떠한 패킷이냐에 따라 처리 방식이 다르기에 {0}으로 선언하여 설정한 후, 추후 데이터를 넣는 방식으로 접근한다.
📿 managerRegisterFormat 추가
추가로 managerRegisterFormat을 선언하여 Register 부분에서 자동화가 필요한 부분을 {0}으로 작성해준다.
위와 같이 작성한다면 managerRegisterFormat 값이 ManagerFormat의 구멍을 매워주도록 처리할 것이다.
📿 PacketManager 새롭게 생성
static string managerRegister;
기존에 자동화를 진행했던 것처럼 stringFormat()을 활용하여 managerFormat 타입 {0}에 맞도록 managerRegister를 담아서 사용한다.
📿 ParsePacket 추가
위에서 선언한 managerRegister의 내용을 채워주기 위해 이번에는 managerRegister 형식에 패킷의 이름을 추가해준다.
managerRegister += string.Format(PacketFormat.managerRegister Format, packetName) + Environment.NewLine;
📿 배치 파일 재생성
새로 생성한 PacketManager를 각 폴더에 담아주도록 한다.
단, 위와 같이 작업을 했을 때 PacketManager 중 일부가 PacketHandler를 참조하고 있기 때문에 Client 영역에도 PacketHandler 항목을 새롭게 추가 생성하고, 내용을 복사, 붙여넣기 해준다.
이제 PDL에서 패킷 내용이 추가되어야 한다면, PacketHandler 에서도 해당 패킷을 처리하는 방식이 추가되어야 한다.
❗ 현 Packet의 문제점
지금까지 Packet Manager 자동화 처리를 해주었는데, 여기서 문제가 발생할 수 있다. 바로 패킷 통신 종류의 따른 문제이다. 패킷의 종류에는 A 서버와 B 서버 즉 서버끼리 통신하는 패킷이 있을테이고, 클라이언트 - 서버 사이에 통신하는 패킷으로 나누어 질 것이다.
그렇지만 특저 유저가 악의적으로 서버끼리 통신하는 패킷 사이에 임의적으로 접근하는 경우가 생길경우 문제가 될 수 있다.
이로 인해 패킷별로 클라이언트와 서버의 통신인지, 서버와 서버의 통신인지를 구분하는 내용을 추가해주고 이에 따라 제한 사항을 두는 방식으로 활용해보자.
📿 네이밍 규칙을 활용한 처리
PDL 파일에 name을 작성하는 영역에 usage와 같은 방법으로 처리할 수 있지만, 보다 간단한 방법으로 이름으로 이를 구분하여 사용하는 방법을 택해보자.
S를 시작하는 것은 서버 → 클라이언트이며, C로 시작하는 것이 서버에서 처리를 하는 내용이다.
📿 PacketGenerator 수정
위에서 생성해주었던 PacketGenerator의 내용을 약간 수정해주어여 한다. 왜냐하면 server, client 용을 따로 구분해주기 시작했기 때문이다.
선언
static string serverRegister;
static string clientRegister;
파일 제작
파일을 만들 때에도 client와 server를 따로 제작하여 구분해준다.
string clientManagerText = string.Format(PacketFormat.managerFormat, clientRegister);
File.WriteAllText("ClientPacketManager.cs", clientManagerText);
string serverManagerText = string.Format(PacketFormat.managerFormat, serverRegister);
File.WriteAllText("ServerPacketManager.cs", serverManagerText);
패킷 내용 생성
if (packetName.StartsWith("S_") || packetName.StartsWith("s_"))
clientRegister += string.Format(PacketFormat.managerRegisterFormat, packetName) + Environment.NewLine;
else if (packetName.StartsWith("C_") || packetName.StartsWith("c_"))
serverRegister += string.Format(PacketFormat.managerRegisterFormat, packetName) + Environment.NewLine;
배치파일 수정
마지막으로 배치 파일도 하나의 파일을 통해 관리하는 것이 아닌 server, client으로 구분지어 각 파일 별로 처리하여 담당한다.
테스트
새로 빌드한 후에 bat 파일을 다시 가서 PacketHandler의 의해 새롭게 생성된 패킷에 맞춰서 정의 해준 뒤, 다시 실행한다면 정상적으로 잘 동작하는 것을 확인할 수 있다.
드디어 Packet 자동화가 끝이 났다. 회사에서 매일 하나의 한 강의씩 듣고 있는데 이번 챕터가 유독 길게 느껴졌다. 😢
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 4-5-2. Job Queue : 채팅 테스트 #2 (1) | 2023.12.26 |
---|---|
Part 4-5-1. Job Queue : 채팅 테스트 #1 (1) | 2023.12.23 |
Part 4-4-10. 패킷 직렬화 : Packet Generator #5 (0) | 2023.12.22 |
Part 4-4-9. 패킷 직렬화 : Packet Generator #4 (0) | 2023.12.20 |
Part 4-4-8. 패킷 직렬화 : Packet Generator #3 (0) | 2023.12.19 |