1. 개요
클라이언트가 서버에 접속을 하면 객체를 생성, 표시하고 클라이언트의 명령을
서버가 받아 처리해서 움직이는 프로그램을 작성하였습니다.
서버는 IOCP, 클라이언트는 EventSelect 방식으로 구현했습니다.
주로 참고한 서적은 Network Programming For Windows 2판,
온라인 게임 서버 프로그래밍 ( 한동훈 저 ) 입니다.
2. 프로그램 화면
-- 화면설명 --
동영상을 올리고 보니 화질이 조금 나빠져서 구분이 좀 안되는데
화면에서 왼쪽위가 서버고 나머지 3개는 클라이언트를 띄워 놓은 것입니다.
아이디, 비밀번호 확인작업은 미뤄놓은 상태이고 아이디를 치고 로그인을 하면
간단하게 원과 이름이 뜨게 했습니다.
객체의 이동은 방향키로 하게 해서 방향키를 누르면 어떤 키를 눌렀는지 서버로 전송하고
서버에서는 해당하는 방향으로 속도를 더해줍니다. 방향키를 해제했을때는 마찬가지로
서버로 전송해서 해당하는 방향의 속도를 다시 원래대로 해줍니다.
그리고 서버에서는 객체의 속도에 따른 이동을 프레임별로 계산해서 그 위치가 변했을 경우
변한 위치를 해당 클라이언트 및 다른 접속해있는 클라이언트에게 보내주어서
각 클라이언트의 객체 위치를 갱신합니다.
그리고 클라이언트가 접속하거나 종료했을 경우에는 서버에 접속한 클라이언트들에게
정보를 보내주어 자신의 화면에서 해당 객체를 사라지게 합니다.
3. 서버 클래스 다이어그램

클래스 맴버와 메소드까지 표현하면 너무 복잡해지기에 기본적인 서버의 구조만 표현하였습니다.
간단히 클래스에 대해 설명을 하겠습니다.
CGame - 서버의 생성, 소멸 및 진행을 관리합니다.
CUser - 유저에 대한 정보를 가지는 클래스이나 현재상태에서는 특별한 게 없기때문에 위 화면에서
객체의 역할을 하고 있고 자신의 위치를 갱신하는 역할을 합니다.
CUserManager - CUser 클래스의 생성, 소멸 및 생성된 CUser 클래스을 저장하는 등 이름 그대로
CUser 클래스의 관리자역할입니다.
CNetServer - 게임서버 내에서도 네트웍에 관련된 부분을 전담한다는 의미로 NetServer라는 이름을
붙였습니다. 네트웍관련부분의 생성, 소멸, 진행을 관리합니다.
CSrvIOCP - CIocp클래스를 상속받아 IOCP의 생성과 소멸 및 I/O Completion Queue 의 메세지를
처리하는 역할을 합니다.
CNetObj - 각각의 클라이언트와의 데이터 송수신을 담당하는 클래스로 네트웍상에서 위의 CUser의
역할을 한다고 볼 수도 있겠습니다. 위의 그림에는 표시가 안되있지만 CUser클래스와
CNetObj 클래스는 상호연관되어있습니다.
CNetObjManager - CNetObj 의 생성과 소멸 및 연결상태를 관리하는 클래스입니다. 일정시간마다
클라이언트에게 패킷을 보내 접속상태를 확인하는 등의 역할을 합니다.
CWorldClock - 게임시간의 계산을 담당합니다.
그 외 라이브러리 소스의 클래스들이 있는데 이 것은 주로 서적을 참고로 했습니다.
4. 향후계획
- DB쪽으로 아는 바가 없어 DB쪽으로 공부를 하면서 로그인 서버를 구현해보려고 합니다. 전에 Sqlite
를 이용해서 해본적은 있지만 그 라이브러리로는 DB를 제대로 사용하기 힘들다고 느껴서입니다.
- 조금 더 게임스러운 요소를 넣어 볼까합니다. 일단 생각은 간단한 슈팅게임정도로 생각하고 있습니다.
5. 첨부
- 코딩스타일 확인을 위한 서버쪽 소스 코드파일과 라이브러리 소스 코드파일을 첨부합니다.





최근 덧글