본문 바로가기
게임 서버(TCP)

게임 서버 입문해보기 1 - 유니티 개발자를 위한 C#으로 온라인 게임 서버 만들기

by 17번 일개미 2024. 10. 14.
728x90

갑자기 서버 역량도 있었으면 좋겠다는 생각이 들었다.

 

그래서 책을 샀다.

 

 

책 홍보는 아니다.

 

그냥 내가 고른 책이다.

 

https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000003336670

 

유니티 개발자를 위한 C#으로 온라인 게임 서버 만들기 | 이석현 | 한빛미디어- 교보ebook

유니티 클라이언트 개발자여! 이제 서버까지 개발하고 완전체로 거듭나자! 이 책은 C#으로 온라인 게임 서버를 개발하는 방법을 소개한다. 닷넷 프레임워크에서 TCP 소켓 기능을 활용하는 방법을

ebook-product.kyobobook.co.kr

 

교보문고에서 eBook 으로 샀다.

 


 

1. CNetworkService

책의 첫 장부터 다짜고짜 이 클래스를 만들기 시작한다.

.Net 에 정의된 클래스 인 줄 알았는데 그냥 직접 만든 클래스였고, 가장 메인이 되는 클래스였다.

왜 이름이 CNetworkService 인지 GPT 에게 물어보니,

C (언어 설명) + NetworkService (그냥 이름) 조합인 것 같다고 했다.

 

다음에는 그냥 내 마음대로 이름을 정해야겠다.

 

이 클래스에서는
1. 클라이언트의 접속을 받기 위한 Listener 객체

2. 메세지 송수신에 필요한 SocketAsyncEventArgsPool 2개

3. 전체 버퍼를 관리할 BufferManager

4. 클라이언트 접속 시 발생할 콜백

 

을 기본 구조로 선언한다.

 

전부 생소한 개념이었다.

 


2. SocketAsyncEventArgs

공부하다보니 가장 많이 마주치는 객체였다. 닷넷 기본 제공 클래스이다.

다만 이를 효율적으로 사용하기 위해 Pooling 을 사용한다.

 

어려울 거 없이 그냥 Pool 클래스를 하나 만들어서 Stack<SocketAsyncEventArgs> 자료구조를 선언하고,

Push(), Pop()  메서드를 구현해서 사용하면 된다.

 


3. Listener

listener 클래스에서는 Start() 메서드를 만들고,

해당 메서드에 접속할 서버의 IP 주소와 포트를 넘겨주고 호출하면 클라이언트가 접속할 수 있는

대기 상태로 만들어준다.

 

소켓을 생성할 때는 아래와 같이 생성한다.

 

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

 

InterNetwork 는 IPv4 를 의미하고, Stream 은 양방향 타입, Tcp 는 말 그대로 Tcp 를 의미했다.

 

소켓을 만들고, 엔드 포인트를 서버 IP 주소로 설정하고 소켓에 바인딩한다.

그리고 소켓의 Listen() 을 호출하면 대기 상태가 된다.

 

SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);

socket.AcceptAsync(args);

void OnAcceptCompleted(){}

 

Accept 가 완료될 때 할 이벤트를 하나 만들어주고, AcceptAsync() 를 호출하면,

Bind -> Listen -> Accept 의 과정이 일어난다.

 

여기서 AcceptAsync 를 호출할 때 해당 메인 스레드가 입력을 받는 상황처럼 스레드가 정지되는 상황에는

Accept 가 발생하지 않을 수 있으므로,

 

별도의 스레드를 생성해서 Accept 가 일어나도록 해야한다.

 


4. Thread

스레드를 생성하는 법은 다음과 같다.

Thread thread = new Thread(실행할 함수);
thread.Start();

 

이렇게 하면 별도 스레드에서 Accept 과정을 처리하게 만들어 메인스레드가 대기 상태에서 Accept 를 하지 못하는 상황은 해결된다.

 


5. AcceptAsync

닷넷의 AcceptAsync() 등의 함수를 사용할 때에는 일종의 루틴이 있다.

비동기 호출이 완료되면 true 의 bool 값을 반환하고, 동기적으로 완료되면 false 값을 반환한다.

따라서, 동기적으로 완료되었을 경우 Accept 이후의 콜백을 직접 호출할 필요가 있으므로,

반환 값을 확인하여 추가로직을 작성한다.

 

// 예시
bool pending = socket.AcceptAsync(args);

// ...
// ...

if (pending == false)
{
	OnAcceptCompleted();
}

 

728x90

'게임 서버(TCP)' 카테고리의 다른 글

게임 서버 입문하기 - 2 / Disconnect 에 대하여  (2) 2024.10.17