클라이언트와 서버 연결 방식... 그리고 아스키코드값 잠깐 정리!

shockwave·2024년 8월 23일

TIL

목록 보기
17/49

오늘은 개인과제 코드리뷰를 시작한 지 2일차
내 눈에 코드를 잘 짜신 분들이 많아서 배울 점이 너무 많았다.

아스키코드값 정리
숫자 0 ~ 9 => 48 ~ 57
알파벳 A ~ Z => 65 ~ 90
알파벳 a ~ z => 97 ~ 122


String.prototype.replace(origin, shift)
String에서 origin 문자열을 발견시 shift문자열로 대체해서 반환해준다. (처음 발견한 문자열만)
String.prototype.replaceAll(origin, shift)
String에서 origin 문자열을 발견시 shift문자열로 대체해서 반환해준다. (해당되는 모든 문자열)


클라이언트 - 서버(데이터관리) 연결
=> 일반적인 인증(아이디/패스워드 입력 등)된 연결이 필요할 때 쓰인다

호스트 서버 연결
=> 클라이언트(유저) 중 하나가 다른 플레이어의 서버 역할도 하는 경우
=> 스타듀밸리 같은 전용 서버 인프라가 필요하지 않은 멀티플레이어 인디 게임류

Peer to Peer (P2P) 연결
시스템의 모든 클라이언트가 서버 역할을 한다.
서로의 클라이언트가 공유 통신으로 서버 역할을 함
연결상태가 좋지 않은 한 플레이어의 영향을 최소화 한다.

비동기적(Asynchronous)인 시스템
동시에 온라인 상태가 아니어도 아이템을 판매하거나 구매할 수 있는 경매장시스템
서로 커뮤니케이션이 필요없고 순서만 따르면 되는 온라인 보드게임 (ex> 체스 등)


컴퓨터끼리 서로 통신하기 위해서는 서로가 같은 프로토콜을 사용해야 한다.

LAN(Local Area Network)근거리통신과 인터넷을 통한 통신의 프로토콜은 동일하다.
컴퓨터가 서로 통신하는 데 사용하는 주요계층에는 TCP / UDP가 있다

TCP - 통신 프로토콜(Transmission communicated protocol)

  • 데이터를 느리게 전송하지만 약간의 오버헤드와 함께 항상 올바른 순서로 도착하도록 보장
    UDP - 사용자 데이터그램 프로토콜(user datagram protocol)
  • 데이터를 빠르게 전송하지만 다른 사용자가 데이터를 수신할 때 정확성이나 순서 보장x
    게임 내에서
    TCP - 사용자 정보 전달
    UDP - 게임 내 개체 상태와 같이 빠르게 업데이트되는 데이터를 전달

컴퓨터끼리 연결되려면 이런 프로토콜(TCP/UDP) 중 하나를 사용해 소켓을 열어 서로 연결한다.
소켓을 통해서 주소, 프로토콜 및 포트를 사용하여 다른 컴퓨터로 데이터를 보낼 수 있게 된다.
IP주소를 알면 내 IP의 정보와 해당 IP의 정보 그리고 (공유하는)포트번호를 입력해 서로 네트워크패킷(데이터)를 보낼 수 있게 되고
DNS를 사용하여 호스트 이름을 IP주소로 확인할 수 있는 호스트 이름도 있따.
IP주소 알아보기 방법 -> ping 커맨드


포트 - 소켓 내 해당 네트워크에 있는 한 대의 컴퓨터에만 연결할 수 있다.
ex> A소켓 내 Port22>10.0.0.1 , Port443>10.0.0.2

IP주소는 거리주소이고 포트는 해당 주소의 아파트 호수라고 생각하면 쉽다!
(각 포트는 하나의 개별 컴퓨터에만 연결할 수 있다!)

라우터(공유기)를 이용해 WAN주소를 주소변환(NAT)이라는 알고리즘을 복잡하게 작동하여 로컬 주소로 변환할 수 있다.


게임에서의 요소들

1.게임 상태
한 컴퓨터에서 다른 컴퓨터로 통신할 수 있도록 현재 게임과 관련된 정보.

1-a. 직렬화된 정보
데이터를 한 컴퓨터에서 다른 컴퓨터로 전송하거나 디스크에 쓸 수 있는 바이트 또는 숫자 문자열로 변환하는 프로세스
-> 게임의 일부 중 두 컴퓨터 간의 물리 시뮬레이션을 동기화하기 위한 3D 위치 또는 속도 데이터와 같은 보다 복잡한 데이터로 확장된다.
-> 단순한 게임 : 플레이어가 움직이거나 게임에 다시 참여할 때마다 업데이트하면 된다.
-> 복잡한 게임 : 물리 개체같은 실시간 데이터를 처리하기위해 빠른 업데이트가 필요하다.

1-b. 틱 레이트(Tick Rate)
함께 게임을 플레이하는 컴퓨터 간에 게임이 업데이트되는 빈도.
(tip) 20 틱레이트 (tick rate of 20) = 초당 20회의 업데이트
-> 서버가 클라이언트에 정보를 초당 20회 보낸다(여러 정보들)
-> 정보를 받은 클라이언트가 업데이트한다.

-> 유저가 업데이트를 요청한다.(캐릭터 이동조작)
-> 서버가 유효성검사를 한다. (Validated)
-> 유효성검사를 통과하면 해당 네트워크에 있는 모든 클라이언트에 업데이트정보를 보낸다.
-> 틱레이트 주기로 클라이언트들이 받은 정보를 업데이트한다.

대부분의 게임에선 UDP를 선호하는데 (빠르기 때문)
이 UDP모델은 요청을 받은 데이터정보들을 서버로 전송된 순서대로 수신되지 않기 때문에 (각자의 속도가 다를 수 있으므로) 순서가 뒤틀린 개체는 앞뒤로 흔들릴 수 있다. (네트워크 지터링) https://www.ir.com/guides/what-is-network-jitter#:~:text=Jitter%20is%20the%20variation%20in,or%20not%20implementing%20packet%20prioritization.

따라서 이 문제를 해결하기 위한 일반적인 해결책은 "버퍼"를 사용하는 것이다.

유튜브나 넷플릭스를 보면 작은 버퍼 공간이 보인다. (흰선 회색선)
이 공간은 수신되었지만 아직 사용자에게 표시되지 않은 데이터를 나타낸다.
버퍼를 절약하면, 통신이 잠시 중단되도 영상이 끊기거나 깨지는 일이 없어 유용하다.
이런 버퍼와 지연 모델은
핑 및 통신 시간을 확인한 다음 해당 개수의 틱에 대한 버퍼를 생성하여 설명된다.


횡설수설해도 리뷰하면서 메모했던 것들을 다시 조사해보기위해 여기에 같이 적는다.

네트워크 지터 netwrok jitter
레이턴시 latency
핑 ping

Static = 정적 메서드

오브젝트풀링
// 자주 사용하고 자주 사라져야하는 오브젝트를 미리 생성후 재활용 (빌리고 반납한다)
// 인스턴스를 무한히 생성하고 무한히 지운다면
// 메모리 파편화되는 위험이 있어서 오브젝트풀링을 써야함
// 풀링메니저한테 메모리공간을 빌려다가 다시 공간을 돌려줌

싱글턴
// 필요 시점에 인스턴스를 단 하나 생성하며, 이후 다른 인스턴스는 생성되지 않는다.
// 필요 시점이 아니라면 메모리 넣어져있는 것이 낭비임
// GameManager.js ->코드 의존성이 증가하는 단점은 있다.
// 싱글턴의 변수나 어떤 속성을 바꿔버리면 여기저기 다 변할 위험성이 있다.

싱글턴 - 텍스트 테이블로 사용가능
csv = ,(comma)로 구분한 테이블
tsv = tab으로 구분한 테이블

형변환(casting)
101 + '101' = '101101'

파싱(parsing) = 어떤 데이터를 불러와서 원하는 형태로 바꾸는 것


기능을 만드는 규칙? - KISS Keep it simple

  • 기능을 심플하게 담당할 것 (직관적으로 어떤 행동을 하는지 보여주는 것)

Class Input () {
입력받는 함수만 구현
}


코드 짜는 흐름

텍스트 로그라이크
자주 사용하는 것들.js - lib (라이브러리)
수학 . js
입력 . js
디자인패턴 . js

장면. scenes
로비
게임

유닛
행동
스탯

=> 분할 정복 기법 (Divide&Counquer)


profile
생각을 많이. 입은 무겁게. 심장은 항상 열심히 뛰는 사람이 되자.

0개의 댓글