2024-10-28 CH-5 개인과제 (멀티 플레이 과제) 과제 시작

MOON·2024년 10월 28일
0

내일배움캠프 과제

목록 보기
24/36
post-thumbnail

이번에도 강의와 함께 과제를 주셨습니다. 이번 과제는 tcp를 이용한 멀티 플레이 게임 서버를 구현해보는 과제입니다.

과제 소개

실제 게임 실행 장면(플레이어2명이 한게임에 접속된 상태입니다.)

그리고 이번엔 튜터님께서 일일 퀘스트처럼 진행 사항을 참고하라고 만들어 주셨습니다. 와우!!

필수 기능 (1~5일차)

1일차 프로젝트 생성 및 이벤트 별 코드 처리

  • 프로젝트 시작
  • 소켓 이벤트 확인
  • 기능별 폴더, 파일 분리
  • 헤더 및 패킷 구조 설계

2일차 환경변수 및 상수, 에러 처리

  • 헤더 및 패킷 구조 설계
  • 상수 선언 및 환경 변수 세팅

3일차 프로토콜 버퍼 적용 및 패킷 파싱

  • 프로토콜 버퍼 적용
  • 패킷 파싱 테스트

4일차 유저 세션 및 게임 세션 관리

  • 유저, 게임 클래스 선언
  • 접속 시 생성 이벤트
  • 세션 관리 로직 추가

5일차 접속 및 이동 패킷 교환

  • 접속 패킷 추가 및 파싱 테스트
  • 클라이언트 접속 테스트
  • 이동 패킷 추가 및 파싱 테스트
  • 멀티플레이어 이동 테스트

🏆

도전 기능 (6~10일차)

6일차 DB 연동

  • DB 세팅 및 (유저 정보) 데이터 모델링
  • (서버) 접속 및 접속 해제 시 유저 정보 기록

7일차 DB 연동

  • (클라이언트) 코드 확인 및 수정

8일차 레이턴시 매니저, 추측항법 적용 - 서버

  • 게임 세션 별 레이턴시 매니저 추가
  • (서버) 추측항법 계산 및 적용

9일차 핑 체크 - 클라이언트

  • (클라이언트) ping 전송 로직 추가
  • (클라, 서버) ping 테스트

10일차 최종 확인 및 테스트

  • 테스트

과제 시작

프로젝트 폴더를 하나 만들고 시작해 보았습니다.

먼저 초반 디렉토리 구조입니다.

📦src
 ┣ 📂config
 ┃ ┗ 📜config.js
 ┣ 📂constants
 ┃ ┣ 📜env.js
 ┃ ┗ 📜header.js
 ┣ 📂events
 ┃ ┣ 📜onConnection.js
 ┃ ┣ 📜onData.js
 ┃ ┣ 📜onEnd.js
 ┃ ┗ 📜onError.js
 ┣ 📂init
 ┣ 📂session
 ┃ ┗ 📜session.js
 ┣ 📂utils
 ┗ 📜server.js

설치한 라이브러리(모듈) : prettier, nodemon, dotenv

서버테스트도 해보았습니다.

sever.js

import net from 'net';
import { config } from './config/config.js';
import { onConnection } from './events/onConnection.js';

const server = net.createServer(onConnection);

server.listen(config.server.port, config.server.host, () => {
  console.log(`서버가 ${config.server.host}:${config.server.port}에서 실행 중 입니다.`);
  console.log(server.address());
});

각각의 이벤트들을 파일로 나누어 관리하게 나누었습니다.

onConnection.js

import { onData } from './onData.js';
import { onEnd } from './onEnd.js';
import { onError } from './onError.js';

export const onConnection = (socket) => {
  socket.on('data', onData(socket));
  socket.on('data', onEnd(socket));
  socket.on('data', onError(socket));
};
onData.js

export const onData = (socket) => (data) => {};
onEnd.js

export const onEnd = (socket) => () => {
  console.log('클라이언트와의 연결이 종료되었습니다.');
};
onError.js

export const onError = (socket) => (err) => {};

그리고 환경변수 및 모든 필요한 상수를 관리하는 constants폴더를 만들어 관리하였습니다.

env.js

import dotenv from 'dotenv';

dotenv.config();

export const PORT = process.env.PORT || 3000;
export const HOST = process.env.HOST || 'localhost';
export const CLIENT_VERSION = process.env.CLIENT_VERSION || '1.0.0';

// 게임 DB 정보
export const DB1_NAME = process.env.DB1_NAME || 'database1';
export const DB1_USER = process.env.DB1_USER || 'user1';
export const DB1_PASSWORD = process.env.DB1_PASSWORD || 'password1';
export const DB1_HOST = process.env.DB1_HOST || 'localhost';
export const DB1_PORT = process.env.DB1_PORT || 3306;

// 유저 DB 정보
export const DB2_NAME = process.env.DB2_NAME || 'database2';
export const DB2_USER = process.env.DB2_USER || 'user2';
export const DB2_PASSWORD = process.env.DB2_PASSWORD || 'password2';
export const DB2_HOST = process.env.DB2_HOST || 'localhost';
export const DB2_PORT = process.env.DB2_PORT || 3306;
header.js

export const TOTAL_LENGTH = 4;
export const PACKET_TYPE_LENGTH = 1;

그다음 config.js파일에서 모든 상수를 이용할 수 있게 관리하여 사용합니다.

import { CLIENT_VERSION, HOST, PORT } from '../constants/env.js';
import { PACKET_TYPE_LENGTH, TOTAL_LENGTH } from '../constants/header.js';

// 구성별로 config변수를 이용해 모든 환경변수, 상수들을 관리하여 사용합니다.
export const config = {
  server: {
    port: PORT,
    host: HOST,
  },
  client: {
    version: CLIENT_VERSION,
  },
  packet: {
    totalLength: TOTAL_LENGTH,
    typeLength: PACKET_TYPE_LENGTH,
  },
};

오늘의 회고
일단 프로젝트를 시작하는 것이 많이 늦었지만 늦은만큼 완성도 있게 개인과제를 완료해 볼려고합니다. 그럼 오늘도 화이팅!

profile
안녕하세요

0개의 댓글