728x90
나만무
중요한 바뀐 점
- byte[] → json으로 패킷 형식 변경으로 대공사를 진행했다.
- packet.js로 class를 이용해 패킷 형식을 관리하고, json을 사용하기 용이하도록 변경했다.
writeEndian 문제
서버에서 클라이언트로 보내는 데이터의 길이나 값이 9억 같이 이상하게 들어오는 오류가 있었다.
- 바이트 데이터를 찍어보면서 데이터가 어떻게 들어오는지 확인했다.
- 들어온 데이터를 분석한 결과 빅 엔디안과 리틀 엔디안 문제라는 것을 파악할 수 있었다.
- writeUInt32BE의 경우 빅엔디안으로 쓰고 LE의 경우 리틀 엔디안으로 쓰는데, BE로 저장하고 LE로 읽으려고 했기 때문에 들어온 데이터가 0으로 읽히는 오류가 발생했다.
- writeUInt32BE를 writeUInt32LE로 수정함으로 오류를 해결했다.

substring→subarray
클라이언트에서 받아온 데이터가 string이 아닌 byte[]였기에 substring() 사용이 불가능했다.
- 배열을 slice할 수 있는 subarray()로 대체했다.
- 하지만 이 함수는 클라이언트에서 전체 배열의 크기를 전송하지 않기 때문에 추후 삭제가 되었다.
const offset = 4;
const jsonstring = Buffer.from(data).substring(offset);
const jsonstring = Buffer.from(data).subarray(offset);
const jsonData = JSON.parse(data.toString());
const protocol = jsonData.type;
Json key name 일치 문제
서버와 클라이언트의 JSON Key 이름이 달라서 오류가 생겼다. 서버에서는 protocol로 보내고, 클라이언트에서는 type으로 값을 받고 있어서 데이터를 읽어오지 못하는 문제가 있었다.
- 클라이언트와 서버의 json 키 이름을 동일하게 맞춰주어서 문제를 해결했다.
TCP 스트림에서 event 단위마다 json을 parse해서 생긴 문제
// 서버에서 발생한 오류
SyntaxError: Unexpected token { in JSON at position 137
TCP는 스트림 형태로 데이터를 전달하다보니 모든 JSON이 한 청크에 오지 않는 경우가 발생해 JSON.parse()에서 오류가 발생했다.
- 개행문자를 json 마지막에 추가해 data가 개행문자를 포함할 때만 파싱하도록 변경했다.
- 단순한 이슈
- recvData = ‘’;에 += data로 스트림을 받아서 개행문자까지 받아와 한 번에 parsing했다.
- recvData = ‘’;를 초기화하는데, 매 이벤트마다 초기화해버려 제대로 동작하지 않았다.
- recvData를 string으로 파싱 성공한 경우에만 초기화하도록 변경하여 해결했다.
728x90
'Study > Project' 카테고리의 다른 글
나만무 슬레이어즈 8 (0) | 2024.05.04 |
---|---|
나만무 슬레이어즈7 (0) | 2024.05.03 |
나만무 슬레이어즈5 (0) | 2024.05.01 |
나만무 슬레이어즈 4 (0) | 2024.04.30 |
나만무 슬레이어즈 3 (0) | 2024.04.30 |