Study/Project

나만무 슬레이어즈6

에린_1 2024. 5. 3. 00:39
728x90

나만무

중요한 바뀐 점

  • byte[] → json으로 패킷 형식 변경으로 대공사를 진행했다.
  • packet.js로 class를 이용해 패킷 형식을 관리하고, json을 사용하기 용이하도록 변경했다.

writeEndian 문제

서버에서 클라이언트로 보내는 데이터의 길이나 값이 9억 같이 이상하게 들어오는 오류가 있었다.

  1. 바이트 데이터를 찍어보면서 데이터가 어떻게 들어오는지 확인했다.
  2. 들어온 데이터를 분석한 결과 빅 엔디안과 리틀 엔디안 문제라는 것을 파악할 수 있었다.
  3. writeUInt32BE의 경우 빅엔디안으로 쓰고 LE의 경우 리틀 엔디안으로 쓰는데, BE로 저장하고 LE로 읽으려고 했기 때문에 들어온 데이터가 0으로 읽히는 오류가 발생했다.
  4. writeUInt32BE를 writeUInt32LE로 수정함으로 오류를 해결했다.

substring→subarray

클라이언트에서 받아온 데이터가 string이 아닌 byte[]였기에 substring() 사용이 불가능했다.

  1. 배열을 slice할 수 있는 subarray()로 대체했다.
  2. 하지만 이 함수는 클라이언트에서 전체 배열의 크기를 전송하지 않기 때문에 추후 삭제가 되었다.
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으로 값을 받고 있어서 데이터를 읽어오지 못하는 문제가 있었다.

  1. 클라이언트와 서버의 json 키 이름을 동일하게 맞춰주어서 문제를 해결했다.

TCP 스트림에서 event 단위마다 json을 parse해서 생긴 문제

// 서버에서 발생한 오류
SyntaxError: Unexpected token { in JSON at position 137

TCP는 스트림 형태로 데이터를 전달하다보니 모든 JSON이 한 청크에 오지 않는 경우가 발생해 JSON.parse()에서 오류가 발생했다.

  1. 개행문자를 json 마지막에 추가해 data가 개행문자를 포함할 때만 파싱하도록 변경했다.
  2. 단순한 이슈
    1. recvData = ‘’;에 += data로 스트림을 받아서 개행문자까지 받아와 한 번에 parsing했다.
    2. recvData = ‘’;를 초기화하는데, 매 이벤트마다 초기화해버려 제대로 동작하지 않았다.
    3. 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