개인공부) 서버실습(25) - Connector

Justin·2022년 6월 16일
1

서버공부

목록 보기
24/45
post-custom-banner

✅ 지난시간

🔌 Connector 만들기

❓ 왜 만들어야 할까?

클라이언트와 서버간의 통신은 당연하지만, 서버만 있는 곳에 왜 Connector가 필요할 까 의문이 들 수 있다.

이유는 게임 서버를 구축하다 보면 서버가 여러개 제작 되기도 하는데, 이때도 서버끼리도 한 명은 요청을 보내고 받는 구조이다. 결국 서버 끼리도 연결 요청이 필요하기에 제작을 해주면 좋다.

💡 Connector 제작

Connector 역시 기존에 DummyClient에서 작업해둔 내역의 문제점을 수정하고, 이를 라이브러리화 시키기 위한 작업을 할 것이다.

🔸 Connect 함수

기존에 짜여진 코드에 처음을 보면 소켓을 생성하고, Connect()를 사용하는데 이 또한 블로킹함수 이기에 구분을 해줄 예정이다.

방법은 Session의 Start()나, Lister의 Init()과 유사한 처리 방식이다. Socket과 이벤트 방식으로 동작하는 SocketAsynEventArgs를 생성하고 동작할 함수, 주소를 연결한다.

🔸 RegisterConnect 함수

Connect()에서 userToken을 통해 소켓 값을 넘겨 받아 사용한다. 이외에도 매개변수로 받거나, 멤버 변수로 사용할 수도 있지만 한 번에 여러개의 소켓이 활용될 수 있기에 이런 식으로 처리를 한다.

다음으로 비동기로 동작하는 ConnectAsyn에 args를 담아주어 성공 실패 처리를 진행 해준다. 여기는 전과 동일하다.

🔸 OnConnecteCompleted 함수

해당 함수에 접속했다는 것은 연결이 완료 됐다는 것인데, 그 때는 보내고 받는 행위를 시작시키면 된다.

그래서 session을 가져와야 하는데, 지난 번에 처리한 것과 동일하게 Func에 담아 _sessionFactory.Invoke()를 통해 받아오는 방안을 활용했다.

📔 라이브러리 만들기

구분 작업을 마친 뒤에 모든 영역에서 함께 사용하기 위해 코드들을 라이브러리 형태로 만들 것이다.

🟢 Server Core 우클릭 -> 속성 이동

🟢 출력 유형 -> 클래스 라이브러리로 변경

🟢 Server Core를 시작 프로그램을 설정 후 실행

이렇게 나오면 잘 적용된 것

🟢 Server, Dummy Client 프로젝트 마우스 우클릭 -> 추가 -> 프로젝트 참조

Server Core 체크 후 확인

프로젝트 솔루션 마우스 우클릭 -> 시작 프로그램 설정 -> Dummy, Server만 시작으로 변경해주기

🚚 서버 코드 이전

라이브러리화 시켜주어 Server Core에서 코드 실행이 되지 않기에, Server 쪽으로 실행 코드를 이전 할 것 이다.

단순하게 ServerCore의 Program -> Server의 Program으로 복붙을 해놓자.

별 오류가 다 발생할텐데, using ServerCore 하나 추가 해준 뒤에, ServerCore의 클래스들을 모두 Public 클래스로 변경해주면 끝.

이렇게 처리하게 되면 이제 엔진과 콘텐츠가 구분된 것이다. 콘텐츠는 엔진의 깊은 곳에서는 뭘 하는지 알 수가 없고, 주어진 함수로만 활용한다.

마치 유니티에서 제공하는 클래스나 함수를 사용하지만 어떤 내용으로 구성되는지는 모르는 구조와 같다.

💠 Blocking 방식 비동기 처리하기

이제 Dummy Client에서 블로킹 함수를 사용하던 부분을 위에서 제작해준 Connector로 교체 작업이 남아있다.

우선 Connector를 동작 시키기 위해서는 Func(_sessionFactory)에 넣어줄 값 즉 어떤 세션인지 만들어서 주어야한다.

그러기 위해서는 기존에 제작해둔 Game Session을 복사해서 가져온다. 이때 using ServerCore 도 선언해주어야한다.

📩 받는 작업 처리

DumyClinet의 실행 함수에서 연결이 됐을 때 보내는 작업을 이렇게 처리 하고 있었는데, 이걸 복사해서 가져온 곳으로 이동 시킬 것이다.

이 위치로 이동 시켜준다.

❕ Recv 가 필요 없는 이유

기존에 작동한던 코드에서 보낸 뒤에 받는 작업을 하고 있었는데 이 부분도 이제는 제거를 해준다.

recv 하는 부분은 Start가 호출되며 알아서 더 효율적인 코드가 콜백되도록 등록을 해두었기 때문이다.

이런 부분에서 확실히 객체 지향의 장점이 살아나는 것 같다.

🔴 마무리

실행 함수에 필요 업는 부분은 다 날려보리고, 오늘 제작한 Connector를 만들고, Connect 함수 까지 호출 해주면 끝이다.

while문은 사용하지 않고, 하나만 실행하게 테스트 해보면 정상 작동하는 걸 알 수 있다.

profile
인디 게임을 만들며 공부하고 있습니다.
post-custom-banner

0개의 댓글