3. 클라이언트 패킷 추가하기

지금까지 만든 서버는 컴파일도 되고 실행도 되지만, 사실 아무런 일도 하지 않는 dummy 서버입니다. iFun Engine 서버가 특정 동작을 하게 하려면 클라이언트로부터 오는 메시지를 처리하게끔 message handler 를 붙여줘야 됩니다. 이 장에서는 클라이언트로부터의 네트워크 패킷을 추가하고 기능을 테스트 해보겠습니다.

3.1. 패킷 핸들러 추가하기

클라이언트한테서 “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. 서버 포트 지정하기

별도의 설정이 없으면 iFun Engine 는 기본 값으로 TCP 8012 번과 HTTP 8018 번 port 를 사용합니다. 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” 메시지를 보냈더니, iFun Engine 는 새로운 session 을 생성하고는 저희가 시킨대로 “world” 라는 결과값을 보내왔다는 것을 알 수 있습니다.

주석

만일 클라이언트 패킷에 세션 정보가 없을 경우 아이펀 엔진은 새 세션 아이디를 부여합니다. 만일 유효하지 않은 세션 정보를 클라이언트가 보내올 경우에는, 악의적으로 찔러보는 일을 막기 위해서 클라이언트에게 응답을 보내지 않고 그냥 조용히 무시합니다.

이제 다음 섹션에서 DB 를 연동하는 법을 알아봅시다.

참고

아이펀 엔진의 헤더 포맷은 HTTP 헤더 포맷과 동일하고, 바디 포맷으로는 잘 알려진 JSON 이나 Protobuf 를 사용하기 때문에, 여러분이 직접 클라이언트 모듈을 만드는 것도 가능합니다. 그러나 좀 더 빨리 게임 개발을 하실 수 있게끔 아이펀 엔진은 다양한 클라이언트 엔진에 대응하는 클라이언트 플러그인을 제공합니다. 아이펀팩토리 Github 계정 을 한번 살펴보세요.

중요

만일 패킷 포맷으로 JSON 을 쓰신다면, _ 로 시작하는 필드명은 아이펀 엔진 내부에서 사용되기 때문에 사용하시면 안됩니다.