3. 클라이언트 패킷 추가하기¶
이번 챕터에서는 클라이언트와 서버가 서로 통신하기 위해서 메시지를 정의하고, 송/수신하는 내용을 알아보겠습니다.
설명에 나오는 메시지 타입들은 아이펀 엔진 프로젝트를 생성하면 사용자 여러분이 바로 사용할 수 있도록 미리 정의되어 있는 메시지들입니다.
3.1. 패킷 핸들러 추가하기¶
hello_wolrd-source/src/event_handlers.cc
파일을 열어보시면
RegistreEventHandlers() 함수가 있습니다.
클라이언트한테서 hello
라는 메시지를 받으면 world
라고 답을 해주는
핸들러를 붙여보겠습니다.
소스 디렉터리에서 src/event_handlers.cc
파일을 열어보시면 다음과 같은 코드가
보이실겁니다.
...
HandlerRegistry::Register("login", OnAccountLogin, login_msg);
...
HandlerRegistry::Register("echo", OnEchoMessage);
...
딱 감이 오시죠? 클라이언트로부터 login
이나 echo
라는 메시지가 오면 각각 OnAccountLogin
과 OnEchoMessage
라는 handler 를 호출해주는 code 입니다. 저 echo
부분 다음에 hello
라는 패킷이 오면 OnHello
라는 핸들러가 호출되게끔 추가해보겠습니다.
HandlerRegistry::Register("hello", OnHello);
그리고 OnHello
라는 함수를 정의합니다. 이 함수는 world
라는 패킷을 클라이언트에게 반환하겠습니다.
void OnHello(const Ptr<Session> &session, const Json &message) {
Json empty_response;
session->SendMessage("world", empty_response);
}
다 됐습니다. 파일을 저장하고 Build 를 해봅시다. Build 에 문제가 없다면 이제 서버를 실행하고 실제로 hello 메시지를 보내볼까요?
$ make
$ ./hello_world-local
3.2. 서버 포트 지정하기¶
별도의 설정이 없으면 아이펀 엔진은 기본 값으로 TCP 8012 번과 HTTP 8018 번 포트를 사용합니다. TCP 로 들어왔든 HTTP 로 들어왔든 상관없이, 아이펀 엔진은 동일한 패킷에 대해서 동일한 핸들러를 호출합니다. 그렇기 때문에 필요하다면 나중에 TCP/UDP/HTTP 등의 전송 프로토콜을 손쉽게 바꾸실 수도 있습니다.
이 설정들은 hello_world/source/src/MANIFEST.json
안에 있습니다. SessionService
라는 부분을 찾아보시면 다음과 같은 부분이 보이실겁니다.
"SessionService": {
"tcp_json_port": 8012,
...
"http_json_port": 8018,
...
},
3.3. 추가한 패킷 핸들러 테스트하기¶
위에 MANIFEST.json
을 통해 기본 설정으로 TCP 와 HTTP 모두가 가능하다는 것을 알았습니다.
여기서는 테스트를 위해서 HTTP 를 이용해 보겠습니다.
우리가 hello
라는 패킷을 추가했기 때문에, http://localhost:8018/v1/messages/hello
라는
URL 을 HTTP 의 POST
메소드로 호출해봅시다. 우리가 추가한 패킷 핸들러는
별다른 내용없이 패킷 타입만으로 동작하는 것이기 때문에 HTTP body 는 비어있는 JSON 오브젝트를 보내겠습니다.
터미널에서 다음처럼 입력합니다.
$ wget -qO- --post-data="{}" http://localhost:8018/v1/messages/hello
팁
터미널 대신 Chrome 이나 Firefox 같은 일부 웹브라우저에는 RESTful API 를 호출할 수 있게 해주는 플러그인을 설치해서 호출하실 수도 있습니다. Chrome 에서는 Postman 이라는 플러그인을 추천합니다.
자 이제 뭐가 보이시나요? 다음처럼 나온다면 모든 것이 정상입니다. (_sid 의 값은 다를 수 있습니다.)
{"_sid":"5452bab6-5927-4353-8978-bb35206135ad","_msgtype":"world"}
저희가 Session 정보 없이 hello
메시지를 보냈더니, 아이펀 엔진은 새로 생성한 Session 정보와 함께
저희가 시킨대로 world
라는 결과값을 돌려줬군요.
참고
만일 클라이언트 패킷에 세션 정보가 없을 경우, 아이펀 엔진은 새 세션 아이디를 부여합니다.
만일 클라이언트가 유효하지 않은 세션 정보를 실어서 보냈을 경우에는, SessionClosed
라는 아이펀 엔진에서 미리 정의한 메시지를 돌려줍니다.
이제 다음 챕터에서는 아이펀 엔진의 ORM 기능을 통해서 DataBase 와 연동하는 방법에 대해서 알아보겠습니다.
팁
아이펀 엔진의 헤더 포맷은 HTTP 헤더 포맷과 동일하고, 바디 포맷으로는 잘 알려진 JSON 이나 Protobuf 를 사용하기 때문에, 여러분이 직접 클라이언트 모듈을 만드는 것도 가능합니다. 그러나 좀 더 빨리 게임 개발을 하실 수 있게끔 아이펀 엔진은 다양한 클라이언트 엔진에 대응하는 클라이언트 플러그인을 제공합니다. 아이펀팩토리 Github 계정 을 한번 살펴보세요.
중요
만일 바디 포맷으로 JSON 을 쓰신다면, _
로 시작하는 필드명은 아이펀 엔진 내부에서 사용되기 때문에 사용하시면 안됩니다.