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의 타입 혹은 변수 이름이 달라서 생긴 상황이었기에
이 부분을 가장 신경 써서 작성해야 한다.