Project_xxx

[Project_] MG - Trouble Shooting

wakelight23 2025. 1. 16. 20:07

TCP 통신 기반 MultiGame 구현 Trouble Shooting

●  proto의 일치화 문제

  - TCP 통신 서버, 클라이언트에서 가장 중요한 부분은 데이터를 어떻게 직렬화할 것인가

  - Binary 형태의 데이터로 주고받는다.

  - 이 과정에서 서버와 클라이언트의 proto의 type, 변수 이름, 순서 등 여러 가지 이유로 서버가 보내는
    데이터와 클라이언트가 받아야 하는 데이터가 다른 상황이 아주 많았다.

// Server의 proto 정의
syntax = "proto3";

package initial;

message InitialPayload {
  string userId = 1;   // 클라이언트와 변수이름이 다르다
  uint playerId = 2;   // 클라이언트와 타입의 byte가 다르다
  float latency = 3;     
}
// Unity 클라이언트의 proto
[ProtoContract]
public class InitialPayload
{
    [ProtoMember(1)]
    public string deviceId { get; set; }

    [ProtoMember(2)]
    public uint playerId { get; set; }
    
    [ProtoMember(3)]
    public float latency { get; set; }
}

 - 위의 proto를 기반으로 서버와 클라이언트가 통신을 시작하면 proto 불일치로 에러가 발생한다.

 - 서로 다른 proto를 주고받고 있기 때문에 서버나 클라이언트 어느 한쪽을 통일시켜야 프로그램이 작동된다.

 

● 작동이 가능하게 수정하면

syntax = "proto3";

package initial;

message InitialPayload {
  string deviceId = 1;   // 변수 이름 통일
  uint32 playerId = 2;   // 타입 통일
  float latency = 3;     
}
[ProtoContract]
public class InitialPayload
{
    [ProtoMember(1)]
    public string deviceId { get; set; }

    [ProtoMember(2)]
    public uint playerId { get; set; }
    
    [ProtoMember(3)]
    public float latency { get; set; }
}

 - C#에서는 uint = 4 byte, JavaScript에서 uint를 사용하게 되면 8byte로 계산되기 때문에 type 문제도 발생했다.

 - type도 byte를 통일하여 사용이 가능하게 했다.

 

가장 중요했던 것 proto 동일화

● proto는 서버와 클라이언트가 데이터를 교환하는 데 있어 가장 중요한 부분이기에
   변수 이름, 타입이 모두 동일해야 한다.

 

● 가장 많은 에러를 발생했던 곳이 proto의 타입 혹은 변수 이름이 달라서 생긴 상황이었기에
   이 부분을 가장 신경 써서 작성해야 한다.