[TIL] 24.12.19 THU

GDORI·7일 전
0

TIL

목록 보기
137/143
post-thumbnail

페이로드가 Null로 도착하는 증상

다른 핸들러는 다 정상적으로 클라이언트에게 proto 패킷이 디코딩 되어서 페이로드가 도착하는데, 특정 패킷만 Null로
도착하는 증상이 있었다.
1. 의심 해 볼만한 것은 proto 파일이 양측간 최신화가 안되어있다는 점
2. 메시지 형식이 맞지 않는 점
3. 신에게 미움산 점

첫번째로 프로토 최신화

유니티 클라이언트에서 Proto를 역직렬화 하는 방법은 protoc 배치파일을 통하여 cs파일로 변환한 후 사용하고 있다.
따라서 이 부분을 서버 것으로 다시 만들어서 최신화를 해주었는데 동일하게 Null로 넘어왔다.

두번째로 메세지 형식 점검

양측 간 메세지 형식도 동일하고 자료형도 같은 것을 확인했다. protoc로 생성된 cs가 문제가 생겼을수도 있어서 직접 열어서 다 조회했는데 문제는 없었다.

서버에서 패킷 만드는 기준

클라이언트가 문제가 없다면 서버에서 문제가 발생했단 소리인데, 패킷 인코딩하는 부분이 다른 핸들러는 작동을 잘하는데 특정 핸들러만 문제가 있는 것을 봐서 인코딩 부분을 다시 살펴봤다.

 if (!PACKET_TYPE_REVERSED[Type]) throw new Error('Invalid Packet Type');

  const typeName = PACKET_TYPE_REVERSED[Type];
  const camel = snakeToCamel(typeName);

  const response = {
    [camel]: data,
  };
 const payload = GamePacket.encode(response).finish();

패킷타입명을 받아서 카멜형식으로 변환 후 패킹하고 페이로드를 GamePacket에서 찾아서 인코딩 시키는 방식으로 구현해놓았었는데, 알고보니... Proto 파일 내 페이로드명이 잘못 되어 있었다...
S2CHealUnitNotification HealUnitNotification = 1001
만들어진 response는 healUnitNotification 으로 패킹되었는데 HealUnitNotification으로 인코딩 하려고 하니
찾지 못하는 증상이었던 것이다.. 맨 앞 대문자로 인해..

그래도 찾아서 해결하였다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글