3. Adding a client-server message¶
We have created a new game server project and succeeded to build and to run, but the game server doesn’t do anything meaningful so far. To make your game server do specific jobs, you should add message handlers for messages coming from the client. In this chapter, we will augment the server by adding a client message handler and to test the added handler.
3.1. Adding a client message handler¶
We will add a client message handler so that let the game server reply with a word world
on the receipt of a client message hello
. Open up src/event_handlers.cc
from the generated source tree and you will be able to locate code like this:
...
HandlerRegistry::Register("login", OnAccountLogin, login_msg);
...
HandlerRegistry::Register("echo", OnEchoMessage);
...
Have you already noticed what the code means? Yes, the code maps client messages (login
and echo
) to their matching message handlers. (OnAccountLogin
and OnEchoMessage
), so that the game server correctly invokes a right handler once it receives one of those messages from the client.
We will append another handler registration code after the echo
stuff.
HandlerRegistry::Register("hello", OnHello);
And we need to define the handler function OnHello
before the new registration code.
It simply returns a server message type world
to the client.
void OnHello(const Ptr<Session> &session, const Json &message) {
Json empty_response;
session->SendMessage("world", empty_response);
}
Yay! We’re done. Store the change and build the game server. If no compiler error, you can run the game server like this:
$ make
$ ./hello_world-local
3.2. Specifying the server’s listening ports¶
By default, iFun Engine listens at port 8012 for TCP connections and port 8018 for HTTP requests. Please remember that the same message handler is invoked on the receipt of a specific message type, regardless of network protocol. So, you can easily change network protocol (e.g., HTTP to TCP, or vice versa) while keeping your handlers and not changing the server’s behavior, if needed.
And listening ports can be changed by a configuration file hello_world/source/src/MANIFEST.json
.
Locate a component named SessionService
and you can find JSON verse like this:
"SessionService": {
"tcp_json_port": 8012,
...
"http_json_port": 8018,
...
},
3.3. Testing a client message¶
From the configuration file illustrated above, we know that the server is enabled with both TCP and HTTP. For simplicity, we will test with HTTP rather than TCP in this example.
Since we added a client-server message hello
, we will invoke a url http://localhost:8018/v1/messages/hello
with POST
method and an empty body. Type in the command like this in your terminal window.
$ wget -qO- --post-data="{}" http://localhost:8018/v1/messages/hello
Tip
Instead of the terminal, you may do this using your Chrome or Firefox with a REST client extension. For example, Postman for Chrome.
If everything goes well, you will see a result like this (_sid might differ):
{"_sid":"5452bab6-5927-4353-8978-bb35206135ad","_msgtype":"world"}
The result indicates that the game server responded a message world
with a new session id on the receipt of hello
.
Note
iFun Engine assigns a new session id if incoming message does not have a session id. For an invalid session id, it silently ignore to prevent malicious probing.
In the next section, I will explain how iFun Engine handles MySQL database.
Tip
The format of iFun Engine’s header is the same as HTTP header. And the body can be of either JSON
or Google Protobuf
. So, it would not be difficult for you to implement own client-side module that handles incoming bare messages. But iFun Engine provides client-side modules for various game client engines including Unity3D and Unreal for fast development. Please visit iFunFactory Github account .
Important
If you use JSON as a client-server message format, field name with a leading underscore is reserved. You must not use such a name.