공부/인프런 - Rookiss

Part 4-4-8. 패킷 직렬화 : Packet Generator #3

셩잇님 2023. 12. 19. 20:05
반응형

 

 

패킷 직렬화

 

 지난 시간에는 Packet Generator를 이용하여 패킷 처리 코드를 자동화 하는 작업을 해보았다. 또한 완성된 코드를 기존 코드에 대체해보며 정상적으로 코드가 실행되는지 테스트해보았다. 오늘도 지난 시간에 이어 자동화 코드를 보다 개선해보도록 하자.

 


 

💘 FileForamt

 

 코드를 계속해서 수정하는데, 이를 매번 Client Session, Server Session에 복사, 붙여넣기 하는 작업 또한 귀찮아진다. 따라서 해당 과정도 파일의 내용을 참조하여 사용해 자동화 하는 과정을 만들 수 있다. 이를 처리하기 위해서는 PacketFormat 스크립트 내부에 몇 가지 코드를 더 작성해야 하므로 먼저 그 작업을 처리해보자.

 

🖋️ Using 처리

 

 파일을 통째로 가져와서 사용하기 위해서는 using 으로 선언된 부분도 가져와야 한다. 따라서 사용하지 않는 것들은 지워주고 현재 필요한 것들만 모아서 다음과 같이 처리한다.

 

 

 이 때 {0}에는 패킷 이름과 번호 목록을 받아서 사용하고, {1}에는 아래에서 자동화한 코드들을 담아 fileFormat 이라는 이름으로 이를 모두 묶어주어 처리할 것이다.

 

🐛 Enum 처리

 

 기존에 아래와 같은 방법으로 어떠한 패킷이 넘어왔는지 Packet의 ID를 확인하기 위해 만들어준 Enum 문이 존재한다. 해당 코드 또한 자동화를 위해 작업해준다. 😎

 

	public enum PacketID // 기존 코드
	{
		PlayerInforReq = 1,
		PlayerInforOk = 2,
	}

 

 PacketFormat에 아래와 같이 Enum 문을 위한 Format을 추가적으로 작성한다. 이를 통해 FileFormat과 함께 처리를 진행하여 파일을 만들어 줄 것이다.

 

 


 

💘 FileForamt - Main 적용

 

 지난 시간에 아래와 같이 사용했던 File.WriteAllText를 사용해서 GenPacket 이라는 이름을 가진 파일을 생헝하도록 했었다.

 

File.WriteAllText("GenPackets.cs", genPackets);

 

 이제 위 코드를 조금 변경하여 FilText 라는 string을 선언해주고, 여기에 앞서 작업해준 FileFormat 형태의 값들을 맞추어 담아준 뒤, genPackets 또한 여기에 담아주어 이를 파일로 만들고 내용을 합쳐 처리한다.

 

string fileText = string.Format(PacketFormat. fileFormat, /* 파일 형식 */ packetEnums, /* 패킷 이름 */ genPackets); /* 패킷 목록(기존 자동화 코드) */

 

 

💧 ParsePacket() 수정

 

 직접적으로 genPacket에 내용을 넣어주었던 ParsePacket() 메서드 내에 enum 값 증감 처리를 위한 코드돠 아래와 같이 작성하여 처리한다.

 

 

 프로젝트의 따라서 Enum 값 처리 및 증가는 달리 처리할 수 있겠지만, 해당 프로젝트에서는 전위증감 연산자를 통해 처리하기 때문에 하나로 using, enum 값에 대한 내용이 합쳐저 파일로 생성된다.

 


 

🌫️ Byte 처리

 

 지난 시간 byte에 대한 처리를 진행하지 않고, 잠시 미루어두었는데 이번 시간에 byte를 처리하도록 하자. 우리는 패킷을 넘겨주고 받을 때 BitConvert를 계속 사용해왔는데 byte는 이미 byte 타입이기 때문에 다른 방식을 사용해 처리해주어야 한다. 

 

🚗 Byte - Read, Wirte

 

 바이트 처리는 기존에 해주었던 작업과 같이 처리해주면 된다. 

 

test를 위한 byte 자료형 변수 선언

 

 read를 진행하는 PacketFormat에 아래와 같이 byte 타입에 대한 처리를 추가적으로 작성해주면 된다. 이 때에 sbyte를 사용할 수 있으니 byte로 캐스팅하기 위헤 {1}의 값을 추가적으로 작성한다. 👀

 

 

 Write 역시 동일하게 PacketFormat 스크립트 내부에 처리를 추가해준다.

 

 

 위와 같이 PacketFormat 스크립트 내부에 Read, Write를 작성해주었다면 Program 스크립트로 이동하여 기존의 switch 문에서 byte 타입을 처리하는 작업을 작성해주면 된다. 😎

 

 


 

👼 이중 list 테스트

 

 현재 Skill 이라는 구조체를 list에 담아서 사용하고 있는데, 해당 스킬 안에 또다른 list가 필요한 순간이 있을 수 있다. 이러할 때에도 정상적으로 잘 동작하는 확인하기 위해 테스트를 해보자. 🤔

 

테스트를 위해 PDL에 attributes라는 list를 추가하고 att라는 int 값을 추가해주었다.

 

var skill = new PlayerInforReq.Skill() { id = 101, level = 1, duration = 5f };
skill.attributes.Add(new PlayerInforReq.Skill.Attribute() { att = 1000 });
packet.skills.Add(skill);

 

 ServerClinet에서 attributes에 대한 값을 담아주어 처리한다. 그러나 구조체(Struct)를 사용하고 있어 에러가 발생하기 때문에 이를 구조체를 클래스로 변경한 뒤 테스트를 진행한다.

 

 


 

 

 패킷 받는 부분을 디버그로 확인해 볼 경우 정상적으로 받아와 처리를 하는 것을 확인할 수 있다. 😎

 

 

 

 

반응형