EzyFox C++ Client SDK
Updated at 16998042940001. Introduce
EzyFox C++ SDK is a C/C++ client library of EzyFox Server. It supports TCP and UDP protocol and use MessagePack for data transportation. You can use this SDK for every projects use C/C++ (i.e android, iOS, desktop apps). It's free available and open source on Github2. Installation
Clone ezyfox-server-cpp-client to your project:
git clone https://github.com/youngmonkeys/ezyfox-server-cpp-client.git
For Android JNI, you need add this line to Android.mk file
import-module, ezyfox-client)
For Android use cmake, you need add two lines to CMakeLists.txt file
add_subdirectory(ezyfox-client) target_link_libraries(${APP_NAME} ezyfox-client)
For iOS, you just need add ezyfox-client.xcodeproj to your project:
3. Coding
Completed source code avalable on Space Game example, class SocketClientProxy
3.1 Import
#include "EzyHeaders.h"
3.2 Create a configuration
Please take a look EzyClientConfig class if you want to see more configurable fields.
auto config = config::EzyClientConfig::create();
config->setClientName(ZONE_NAME);
3.2 Create a Client
After create the configuration, you can create a client like this. Take a look EzyClient and EzyClients to get more information.
mSocketClient = EzyUTClient::create(config); EzyClients::getInstance()->addClient(mSocketClient);
3.3 Setup the Client
After create the client, let's setup it, 'setup' mean add event handlers and data handlers to the client. List of event handlers include:
- ConnectionSuccess: Fire when the client connected to server
- ConnectionFailure: Fire when the client connect to server failed
- Disconnection: Fire when the client was disconnected from server
- LostPing: Fire when client send ping but didn't received pong command from server
- TryConnect: Fire when the client connect to server failed and retry to connect again
Take a look EzyEventType class to get more information. List of data commands include:
- Error: Fire when the client received and error from server
- Handshake: Client send and receive handshake command
- Ping: Client send ping command to keep connection
- Pong: Fire when client received pong response from server
- Login: Client send and receive login command if login successfully
- LoginError: Fire when received login error response from server
- AppAccess: Client send this command to join to an application and receive when join successfully
- AppRequest: Client send data to an application on server and receive if there is any response
- AppExit: Client send to server to exit from an application
- AppAccessError: Fire when received join an application failed from server,
- AppRequestError: Fire when received an error response from application on server,
- PluginInfo: Client send to get information of a plugin and receive response from server,
- PluginRequest: lient send data to an plugin on server and receive if there is any response
Take a look constant package, EzyCommand class, EzyEventHandler class and EzyDataHandler class to get more information and you can setup the client like this:
auto setup = mSocketClient->setup(); setup->addEventHandler(event::ConnectionSuccess, new handler::EzyConnectionSuccessHandler()); setup->addEventHandler(event::ConnectionFailure, new handler::EzyConnectionFailureHandler()); setup->addEventHandler(event::Disconnection, new DisconnectionHandler()); setup->addDataHandler(constant::Handshake, new HandshakeHandler()); setup->addDataHandler(constant::Login, new LoginSuccessHandler()); setup->addDataHandler(constant::LoginError, new handler::EzyLoginErrorHandler()); setup->addDataHandler(constant::AppAccess, new AppAccessHandler()); setup->addDataHandler(constant::UdpHandshake, new UdpHandshakeHandler());
For TCP we need follow by the authenticaiton flow:
For UDP we need follow by the authenticaiton flow:
3.4 Customer an event handler
You can custom to do everything you want, please take a look EzyEventHandler and EzyEventHandlers to see default event handlers and take a look to this file for full example.
class DisconnectionHandler : public handler::EzyDisconnectionHandler { protected: bool shouldReconnect(event::EzyDisconnectionEvent* event) override { return true; } void postHandle(event::EzyDisconnectionEvent* event) override { SocketClientProxy::getInstance()->emitDisconnected(); } };
3.5 Custom a data handler
You must custom to handle list of commands:
- Handshake: to send Login command
- Login: to send AppAccess or PluginInfo command
You should custom to handle list of commands:
- LoginError: Maybe to show a notification to user
- AppAccess: Maybe to trigger something and allow user interact your application
Please take a look EzyDataHandler and EzyDataHandlers to get default data handlers and this file for full example
class HandshakeHandler : public handler::EzyHandshakeHandler { protected: request::EzyRequest* getLoginRequest() { auto request = request::EzyLoginRequest::create(); request->setZoneName(ZONE_NAME); request->setUsername(SocketClientProxy::getInstance()->getUsername()); request->setPassword(SocketClientProxy::getInstance()->getPassword()); auto data = new entity::EzyArray(); data->addString(GAME_NAME); request->setData(data); return request; }; }; class LoginSuccessHandler : public handler::EzyLoginSuccessHandler { protected: void handleLoginSuccess(entity::EzyValue* responseData) { mClient->udpConnect(2611); if(SocketClientProxy::getInstance()->isFirstLogin()) SocketClientProxy::getInstance()->setFirstLogin(false); } };
3.6 Setup an App
To listen and process response data of an application received from server you need setup to register handler mapped to command like this:
auto appSetup = setup->setupApp(APP_NAME); appSetup->addDataHandler("reconnect", new ReconnectResponseHandler()); appSetup->addDataHandler("getGameId", new GetGameIdResponseHandler()); appSetup->addDataHandler("startGame", new StartGameResponseHandler());
3.7 Connect to server
After setup the client and an app, it's time to connect to server
mSocketClient->connect("127.0.0.1", 3005); // replace by your server address and port
3.8 Send a request to server
After connect to server and access an app successfully (you need ensure by handle APP_ACCESS response), you can allow interact and send a request to server
Send a TCP request
auto request = new entity::EzyObject(); request->setString("gameName", GAME_NAME); mSocketClient->getApp()->send("getGameId", request);
Send an UDP request
auto position = new entity::EzyObject(); position->setDouble("x", x); position->setDouble("y", y); position->setDouble("z", 0); auto request = new entity::EzyObject(); request->setString("gameName", GAME_NAME); request->setInt("gameId", gameId); request->setInt("objectId", objectId); request->setString("objectName", objectName); request->setBool("visible", visible); request->setObject("position", position); auto app = mSocketClient->getApp(); if(app) { app->udpSend("syncPosition", request); }
And if you have accessed many application in the client, you must get the app you want to send a request:
auto zone = mSocketClient->getZone(); auto appManager = zone->getAppManager(); auto app1 = appManager->getAppByName("appName"); app1->send("requestCommand", request);
Please take a look EzyApp class to see how an app send a request to server, look EzyAppManager to see how to get an app. For full example please take a look this file
Start event loop
If you application has no loop update, you need add:
socket::EzyMainEventsLoop* eventsLoop = new socket::EzyMainEventsLoop();
eventsLoop->start();
If your application has a loop update, you just need to call:
mSocketClient->processEvents();