클라이언트와 서버간의 통신은 당연하지만, 서버만 있는 곳에 왜 Connector가 필요할 까 의문이 들 수 있다.
이유는 게임 서버를 구축하다 보면 서버가 여러개 제작 되기도 하는데, 이때도 서버끼리도 한 명은 요청을 보내고 받는 구조이다. 결국 서버 끼리도 연결 요청이 필요하기에 제작을 해주면 좋다.
Connector 역시 기존에 DummyClient에서 작업해둔 내역의 문제점을 수정하고, 이를 라이브러리화 시키기 위한 작업을 할 것이다.
기존에 짜여진 코드에 처음을 보면 소켓을 생성하고, Connect()를 사용하는데 이 또한 블로킹함수 이기에 구분을 해줄 예정이다.
방법은 Session의 Start()나, Lister의 Init()과 유사한 처리 방식이다. Socket과 이벤트 방식으로 동작하는 SocketAsynEventArgs를 생성하고 동작할 함수, 주소를 연결한다.
Connect()에서 userToken을 통해 소켓 값을 넘겨 받아 사용한다. 이외에도 매개변수로 받거나, 멤버 변수로 사용할 수도 있지만 한 번에 여러개의 소켓이 활용될 수 있기에 이런 식으로 처리를 한다.
다음으로 비동기로 동작하는 ConnectAsyn에 args를 담아주어 성공 실패 처리를 진행 해준다. 여기는 전과 동일하다.
해당 함수에 접속했다는 것은 연결이 완료 됐다는 것인데, 그 때는 보내고 받는 행위를 시작시키면 된다.
그래서 session을 가져와야 하는데, 지난 번에 처리한 것과 동일하게 Func에 담아 _sessionFactory.Invoke()를 통해 받아오는 방안을 활용했다.
구분 작업을 마친 뒤에 모든 영역에서 함께 사용하기 위해 코드들을 라이브러리 형태로 만들 것이다.
이렇게 나오면 잘 적용된 것
Server Core 체크 후 확인
프로젝트 솔루션 마우스 우클릭 -> 시작 프로그램 설정 -> Dummy, Server만 시작으로 변경해주기
라이브러리화 시켜주어 Server Core에서 코드 실행이 되지 않기에, Server 쪽으로 실행 코드를 이전 할 것 이다.
단순하게 ServerCore의 Program -> Server의 Program으로 복붙을 해놓자.
별 오류가 다 발생할텐데, using ServerCore
하나 추가 해준 뒤에, ServerCore의 클래스들을 모두 Public 클래스로 변경해주면 끝.
이렇게 처리하게 되면 이제 엔진과 콘텐츠가 구분된 것이다. 콘텐츠는 엔진의 깊은 곳에서는 뭘 하는지 알 수가 없고, 주어진 함수로만 활용한다.
마치 유니티에서 제공하는 클래스나 함수를 사용하지만 어떤 내용으로 구성되는지는 모르는 구조와 같다.
이제 Dummy Client에서 블로킹 함수를 사용하던 부분을 위에서 제작해준 Connector로 교체 작업이 남아있다.
우선 Connector를 동작 시키기 위해서는 Func(_sessionFactory)에 넣어줄 값 즉 어떤 세션인지 만들어서 주어야한다.
그러기 위해서는 기존에 제작해둔 Game Session을 복사해서 가져온다. 이때 using ServerCore
도 선언해주어야한다.
DumyClinet의 실행 함수에서 연결이 됐을 때 보내는 작업을 이렇게 처리 하고 있었는데, 이걸 복사해서 가져온 곳으로 이동 시킬 것이다.
이 위치로 이동 시켜준다.
기존에 작동한던 코드에서 보낸 뒤에 받는 작업을 하고 있었는데 이 부분도 이제는 제거를 해준다.
recv 하는 부분은 Start가 호출되며 알아서 더 효율적인 코드가 콜백되도록 등록을 해두었기 때문이다.
이런 부분에서 확실히 객체 지향의 장점이 살아나는 것 같다.
실행 함수에 필요 업는 부분은 다 날려보리고, 오늘 제작한 Connector를 만들고, Connect 함수 까지 호출 해주면 끝이다.
while문은 사용하지 않고, 하나만 실행하게 테스트 해보면 정상 작동하는 걸 알 수 있다.