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 라는 메시지가 오면 각각 OnAccountLoginOnEchoMessage 라는 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 을 통해 기본 설정으로 TCPHTTP 모두가 가능하다는 것을 알았습니다.

여기서는 테스트를 위해서 HTTP 를 이용해 보겠습니다.

우리가 hello 라는 패킷을 추가했기 때문에, http://localhost:8018/v1/messages/hello 라는 URLHTTPPOST 메소드로 호출해봅시다. 우리가 추가한 패킷 핸들러는 별다른 내용없이 패킷 타입만으로 동작하는 것이기 때문에 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 을 쓰신다면, _ 로 시작하는 필드명은 아이펀 엔진 내부에서 사용되기 때문에 사용하시면 안됩니다.