打印

关于fdbus:一个更完整的实例

[复制链接]
1042|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2022-9-16 18:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
fdbus普通client-server示例及接口说明

一、server
1.FDServer.h

#pragma once
#include<fdbus/fdbus.h>
#include<fdbus/CBaseServer.h>
using namespace ipc::fdbus;

class FDServer : public CBaseServer
{
public:
        enum EGroupId
        {
                GROUP_MASTER,
                GROUP_1
        };
        enum EMessageId
        {
                NTF_CJSON_TEST = 128,
                NTF_GROUP_TEST1 = fdbMakeEventCode(GROUP_1, 0),
                NTF_GROUP_TEST2 = fdbMakeEventCode(GROUP_1, 1),
                NTF_GROUP_TEST3 = fdbMakeEventCode(GROUP_1, 2)
        };
        static CBaseWorker main_worker;
        FDServer(const char* name, CBaseWorker *worker = 0);
        ~FDServer();

        void broadcastElapseTime(CMethodLoopTimer<FDServer> *timer);

protected:
        virtual void onOnline(const CFdbOnlineInfo &info);
        virtual void onOffline(const CFdbOnlineInfo &info);
        virtual void onInvoke(CBaseJob::Ptr &msg_ref);
        virtual void onSubscribe(CBaseJob::Ptr &msg_ref);

private:
        CMethodLoopTimer<FDServer>* mTimer;
};

class CBroadcastTimer : public CMethodLoopTimer<FDServer>
{
public:
        CBroadcastTimer(FDServer *server);
};

使用特权

评论回复

相关帖子

沙发
keer_zu|  楼主 | 2022-9-16 18:22 | 只看该作者
2.FDServer.cpp
#include "FDServer.h"
#include<fdbus/CFdbProtoMsgBuilder.h>
#include<fdbus/CFdbCJsonMsgBuilder.h>
#include<iostream>
#include<fdbus/cJSON/cJSON.h>
#include"TempleMsg.pb.h"
#include"CFdbIfPerson.h"
CBaseWorker FDServer::main_worker;
FDServer::FDServer(const char * name, CBaseWorker * worker)
        : CBaseServer(name, worker)
{
        mTimer = new CBroadcastTimer(this);
        mTimer->attach(&main_worker, false);
}

FDServer::~FDServer()
{
}

/**server主动推送消息给订阅过该消息的客户端**/
void FDServer::broadcastElapseTime(CMethodLoopTimer<FDServer>* timer)
{
        std::cout << __FUNCTION__ << std::endl;
        NFdbTemple::ElapseTime eTime;
        eTime.set_hour(1);
        eTime.set_minute(20);
        eTime.set_second(45);

        CFdbProtoMsgBuilder builder(eTime);
        /*当消息ID和字符串都匹配时,客户端才对其做出响应,客户端接收消息无先后顺序*/
        broadcast(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, builder, "my_filter");

        char raw_data[256];
        memset(raw_data, '=', sizeof(raw_data));
        /*向客户端主动推送广播消息*/
        broadcast(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, raw_data, 256, "raw_buffer");

        cJSON *f = cJSON_CreateObject();
        cJSON_AddNumberToObject(f, "birthday", 199900101);
        cJSON_AddNumberToObject(f, "id", 1);
        cJSON_AddStringToObject(f, "name", "sofia");
        CFdbCJsonMsgBuilder builder1(f);
        broadcast(NTF_CJSON_TEST, builder1);
        cJSON_Delete(f);

        broadcast(NTF_GROUP_TEST1);
        broadcast(NTF_GROUP_TEST2);
        broadcast(NTF_GROUP_TEST3);
}

/*客户端连接服务器时,响应该函数*/
void FDServer::onOnline(const CFdbOnlineInfo & info)
{
        FDB_LOG_I("server session: %d, secure: %d\n", info.mSid, info.mQOS);
        if (info.mFirstOrLast)
        {
                FDB_LOG_I("time enabled\n");
                mTimer->enable();
        }
        std::cout << __FUNCTION__ << std::endl;
}

/*客户端关闭时,响应该函数*/
void FDServer::onOffline(const CFdbOnlineInfo & info)
{
        FDB_LOG_I("server session off: %d, secure: %d\n", info.mSid, info.mQOS);
        if (info.mFirstOrLast)
        {
                mTimer->disable();
        }
        std::cout << "server session off: " << info.mSid << ",secure: " << info.mQOS << std::endl;
        std::cout << __FUNCTION__ << std::endl;
}

/*接收并处理客户端invoke请求*/
void FDServer::onInvoke(CBaseJob::Ptr & msg_ref)
{
        auto msg = castToMessage<CBaseMessage *>(msg_ref);

        static int32_t elapse_time = 0;
        std::cout << "msg->code():" << msg->code() << std::endl;

        switch (msg->code())
        {
        case NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA:
        {
                NFdbTemple::SongId song_id;
                CFdbProtoMsgParser parser(song_id);
                if (!msg->deserialize(parser))
                {
                        msg->status(msg_ref, FDB_ST_MSG_DECODE_FAIL, "fail to decode");
                        std::cout << "REQ_METADATA song_id fail to decode\n" << std::endl;
                        return;
                }

                std::cout << "request song id:" << song_id.id() << ",sender: " << msg->senderName().c_str() << std::endl;
               
                NFdbTemple::NowPlayingDetails req_msg;
                req_msg.set_artist("Liu Dehua");
                req_msg.set_album("Ten Year's Golden Song");
                req_msg.set_genre("County");
                req_msg.set_title("Wang Qing Shui");
                req_msg.set_file_name("Lau Dewa");
                req_msg.set_elapse_time(elapse_time++);
                CFdbProtoMsgBuilder builder(req_msg);
                msg->reply(msg_ref, builder);
        }
        break;
        case NFdbTemple::FdbMediaSvcMsgId::REQ_RAWDATA:
        {
                int32_t size = msg->getPayloadSize();
                std::cout << "size:" << size << " sender:" << msg->senderName().c_str();
                CFdbParcelableArray<CPerson> persions;
                CPerson *p = persions.Add();
                p->mAddress = "Shanghai";
                p->mAge = 22;
                p->mName = "Zhang San";
                CCar *c = p->mCars.Add();
                c->mBrand = "Hongqi";
                c->mModel = "H5";
                c->mPrice = 400000;

                c = p->mCars.Add();
                c->mBrand = "POWER";
                c->mModel = "X5";
                c->mPrice = 200000;

                for (int32_t i = 0; i < 5; ++i)
                {
                        CFdbByteArray<20> *arr = p->mPrivateInfo.Add();
                        for (int32_t j = 0; i < arr->size(); ++j)
                        {
                                arr->vbuffer()[j] = j;
                        }
                }

                p = persions.Add();
                p->mAddress = "Guangzhou";
                p->mAge = 32;
                p->mName = "Li si";
                c = p->mCars.Add();
                c->mBrand = "Chuanqi";
                c->mModel = "H5";
                c->mPrice = 400000;

                c = p->mCars.Add();
                c->mBrand = "Toyoto";
                c->mModel = "X5";
                c->mPrice = 200000;

                for (int32_t i = 0; i < 8; ++i)
                {
                        CFdbByteArray<20> *arr = p->mPrivateInfo.Add();
                        for (int32_t j = 0; j < arr->size(); ++j)
                        {
                                arr->vbuffer()[j] = j + 10;
                        }
                }

                CFdbParcelableBuilder builder(persions);
                msg->reply(msg_ref, builder);
        }
        break;
        default:
                break;
        }
}

/*当client注册消息时,server通过该回调函数获知,将初始值返回给客户端*/
void FDServer::onSubscribe(CBaseJob::Ptr & msg_ref)
{
        auto msg = castToMessage<CBaseMessage *>(msg_ref);
        const CFdbMsgSubscribeItem *sub_item;
        FDB_BEGIN_FOREACH_SIGNAL(msg, sub_item)
        {
                FdbMsgCode_t msg_code = sub_item->msg_code();
                const char* filter = "";
                if (sub_item->has_filter())
                {
                        filter = sub_item->filter().c_str();
                        std::cout << filter << std::endl;
                }

                FdbSessionId_t sid = msg->session();

                if (fdbIsGroup(msg_code))
                {
                        FDB_LOG_I("group message: %d, filter: %s of session %d is registered! sender: %s\n\n",
                                msg_code, filter, sid, msg->senderName().c_str());
                        /*广播消息给客户端*/
                        msg->broadcast(NTF_GROUP_TEST1);
                        msg->broadcast(NTF_GROUP_TEST2);
                        msg->broadcast(NTF_GROUP_TEST3);
                        return;
                }

                FDB_LOG_I("single message:%d, filter %s of session %d is registered! sender: %s\n\n",
                        msg_code, filter, sid, msg->senderName().c_str());

                switch (msg_code)
                {
                case NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME:
                {
                        std::string str_filter(filter);
                        if (!str_filter.compare("my_filter"))
                        {
                                NFdbTemple::ElapseTime eTime;
                                eTime.set_hour(1);
                                eTime.set_hour(20);
                                eTime.set_hour(30);
                                CFdbProtoMsgBuilder builder(eTime);
                                /*广播消息给客户端*/
                                msg->broadcast(msg_code, builder, filter);
                        }
                        else
                        {
                                std::cout << "it's not the elapse time!" << std::endl;
                        }
                }
                default:
                        break;
                }
        }
        FDB_END_FOREACH_SIGNAL()
}

/*周期性地广播消息给客户端,周期为1500ms*/
CBroadcastTimer::CBroadcastTimer(FDServer *server)
        :CMethodLoopTimer<FDServer>(1500, true, server, &FDServer::broadcastElapseTime)
{}

使用特权

评论回复
板凳
keer_zu|  楼主 | 2022-9-16 18:22 | 只看该作者
3.main.cpp
#include"FDServer.h"
#include<iostream>
int main(int argc, char** argv)
{
        FDB_CONTEXT->start();
        FDServer::main_worker.start();
        //for (int i = 1; i < argc; ++i)
        //{
        /*在Name Server中存在一个名为server_name的服务器,客户端通过server_name连接服务器*/
                std::string server_name = "myService";
                std::string url(FDB_URL_SVC);
                url += server_name;
                server_name += "_server";
                auto server = new FDServer(server_name.c_str(), &FDServer::main_worker);
                server->enableWatchdog(true);
                server->enableUDP(true);
                server->setExportableLevel(FDB_EXPORTABLE_SITE);
                server->bind(url.c_str());
        //}
                std::cout << url << std::endl;
                std::cout << server_name << std::endl;
        CBaseWorker background_worker;
        background_worker.start(FDB_WORKER_EXE_IN_PLACE);
        return 0;
}

使用特权

评论回复
地板
keer_zu|  楼主 | 2022-9-16 18:23 | 只看该作者
二、客户端
1.FDClient.h
#pragma once
#include<fdbus/fdbus.h>
#include<fdbus/CFdbProtoMsgBuilder.h>
#include<fdbus/cJSON/cJSON.h>
#include<fdbus/CFdbCJsonMsgBuilder.h>

using namespace ipc::fdbus;
class FDClient;
class CInvokeTimer : public CMethodLoopTimer<FDClient>
{
public:
        CInvokeTimer(FDClient *client);
};

class FDClient : public CBaseClient
{
public:
        enum EGroupId
        {
                GROUP_MASTER,
                GROUP_1
        };
        enum EMessageId
        {
                NTF_CJSON_TEST = 128,
                NTF_GROUP_TEST1 = fdbMakeEventCode(GROUP_1, 0),
                NTF_GROUP_TEST2 = fdbMakeEventCode(GROUP_1, 1),
                NTF_GROUP_TEST3 = fdbMakeEventCode(GROUP_1, 2)
        };
        static CBaseWorker main_worker;
        FDClient(const char *name, CBaseWorker *worker = 0);
        void callServer(CMethodLoopTimer<FDClient> *timer);
        ~FDClient();

protected:
        void onOnline(const CFdbOnlineInfo &info);
        void onOffline(const CFdbOnlineInfo &info);
        void onBroadcast(CBaseJob::Ptr &msg_ref);
        void onKickDog(CBaseJob::Ptr &msg_ref);
        void onReply(CBaseJob::Ptr &msg_ref);
        void onStatus(CBaseJob::Ptr &msg_ref, int32_t error_code, const char *description);
        void printMetadata(FdbObjectId_t obj_id, const CFdbMsgMetadata *metadata);

private:
        CInvokeTimer *mTimer;
};

使用特权

评论回复
5
keer_zu|  楼主 | 2022-9-16 18:23 | 只看该作者
2.FDClient.cpp
#include "FDClient.h"
#include"TempleMsg.pb.h"
#include"CFdbIfPerson.h"

CBaseWorker FDClient::main_worker;
FDClient::FDClient(const char * name, CBaseWorker * worker)
        : CBaseClient(name, worker)
{
        mTimer = new CInvokeTimer(this);
        mTimer->attach(&main_worker, false);
}

/*向服务器发送请求*/
void FDClient::callServer(CMethodLoopTimer<FDClient>* timer)
{
        FDB_LOG_I("****this is client : %s\n", __FUNCTION__);
        NFdbTemple::SongId song_id;
        song_id.set_id(1234);
        CFdbProtoMsgBuilder builder(song_id);

        CBaseJob::Ptr ref(new CBaseMessage(NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA));
        invoke(ref, builder);/*发送至服务器*/

        auto msg = castToMessage<CBaseMessage*>(ref);
        printMetadata(objId(), msg->metadata());

        if (msg->isStatus())
        {
                int32_t id;
                std::string reason;
                if (!msg->decodeStatus(id, reason))
                {
                        FDB_LOG_E("onReply:fail to decode status\n");
                        return;
                }
                FDB_LOG_I("sync reply: status is received: msg code: %d, id: %d, reason: %s\n",
                        msg->code(), id, reason.c_str());
                return;
        }

        NFdbTemple::NowPlayingDetails now_playing;
        CFdbProtoMsgParser parser(now_playing);
        if (msg->deserialize(parser))
        {
                auto artist = now_playing.artist().c_str();
                auto album = now_playing.album().c_str();
                auto genre = now_playing.genre().c_str();
                auto title = now_playing.title().c_str();
                auto file_name = "";
                if (now_playing.has_file_name())
                {
                        file_name = now_playing.file_name().c_str();
                }
                auto folder_name = "";
                if (now_playing.has_folder_name())
                {
                        folder_name = now_playing.folder_name().c_str();
                }
                int32_t elapse_time = now_playing.elapse_time();
                std::cout << artist << album << genre << title << file_name << folder_name << elapse_time << std::endl;
        }
        else
        {
                FDB_LOG_I("Error! Unable to decode message!!!\n");
        }
        invoke(NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA);
}

FDClient::~FDClient()
{
}

/*客户端连接服务器时响应*/
void FDClient::onOnline(const CFdbOnlineInfo & info)
{
        FDB_LOG_I("client session online: %d, secure: %d\n", info.mSid, info.mQOS);
        mTimer->enable();

        CFdbMsgSubscribeList subscribe_list;
        /*订阅服务器主动推送的广播消息,消息ID与字符串要求和服务器的广播消息保持一致*/
        subscribe_list.addNotifyItem(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, "my_filter");
        subscribe_list.addNotifyItem(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, "raw_buffer");
        subscribe_list.addNotifyItem(NTF_CJSON_TEST);
        subscribe_list.addNotifyGroup(GROUP_1);
        subscribe(subscribe_list, 0, info.mQOS);/*注册广播消息,注册完成系统自动回复*/
}

/*客户端断开时响应*/
void FDClient::onOffline(const CFdbOnlineInfo & info)
{
        FDB_LOG_I("client session off:%d, secure:%d\n", info.mSid, info.mQOS);
        if (info.mFirstOrLast)
        {
                mTimer->disable();
        }
}
/*收到服务器主动推送的广播消息*/
void FDClient::onBroadcast(CBaseJob::Ptr & msg_ref)
{
        auto msg = castToMessage<CBaseMessage*>(msg_ref);
        FDB_LOG_I("Broadcast is received:%d, filter: %s, qos:%d\n", msg->code(), msg->topic().c_str(), msg->qos());

        switch (msg->code())
        {
/*广播消息有消息ID和消息字符串作为标识*/
        case NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME:
        {
                std::string filter(msg->topic());
                if (!filter.compare("my_filter"))
                {
                        NFdbTemple::ElapseTime eTime;
                        CFdbProtoMsgParser parser(eTime);
                        if (msg->deserialize(parser))
                        {
                                FDB_LOG_I("elapse time is received: hour: %d, minute: %d, second: %d", eTime.hour(), eTime.minute(), eTime.second());
                                std::cout << "Broadcast hour: " << eTime.hour() << ", minute: " << eTime.minute() << ", second: " << eTime.second() << std::endl;
                        }
                        else
                        {
                                FDB_LOG_E("Unable to decode Elapsetime\n");
                        }
                }
                else if (!filter.compare("raw_buffer"))
                {
                        int32_t size = msg->getPayloadSize();
                        std::cout << "Broadcast size: " << size << std::endl;
                        FDB_LOG_I("Broadcast of raw buffer is received: size: %d\n", size);
                }
        }
        break;
        case NTF_CJSON_TEST:
        {
                CFdbCJsonMsgParser parser;
                if (msg->deserialize(parser))
                {
                        cJSON *f = parser.retrieve();
                        int birthday = 0;
                        int id = 0;
                        const char* name = 0;
                        if (cJSON_IsObject(f))
                        {
                                cJSON *item = cJSON_GetObjectItem(f, "birthday");
                                if (item && cJSON_IsNumber(item))
                                {
                                        birthday = item->valueint;
                                }
                                item = cJSON_GetObjectItem(f, "id");
                                if (item && cJSON_IsNumber(item))
                                {
                                        id = item->valueint;
                                }

                                item = cJSON_GetObjectItem(f, "name");
                                if (item && cJSON_IsString(item))
                                {
                                        name = item->valuestring;
                                }
                                std::cout << "Broadcast json: birthday: " << birthday << ", id: " << id << ", name: " << name << std::endl;
                                FDB_LOG_I("Broadcast of JSON is: birthday: %d, id: %d, name: %s\n", birthday, id, name);
                        }
                }
                else
                {
                        FDB_LOG_E("Broadcast of JSON is: with error!\n");
                }
                break;
        }
        case NTF_GROUP_TEST1:
        case NTF_GROUP_TEST2:
        case NTF_GROUP_TEST3:
                FDB_LOG_I("Broadcast of group message %d is received, Init:%d\n", fdbMakeEventCode(msg->code()), msg->isInitialResponse());
                std::cout << "Broadcast of group message: " << msg->code() << ", init: " << msg->isInitialResponse() << std::endl;
                break;
        default:
                break;
        }
}

void FDClient::onKickDog(CBaseJob::Ptr & msg_ref)
{
        CFdbMessage::kickDog(msg_ref, worker(), [](CBaseJob::Ptr &msg_ref) {
                CFdbMessage::feedDog(msg_ref);
        });
}
/*异步请求时,通过该回调函数获得server回复*/
void FDClient::onReply(CBaseJob::Ptr & msg_ref)
{
        auto msg = castToMessage<CBaseMessage*>(msg_ref);
        FDB_LOG_I("response is received. sn: %d\n", msg->sn());

        printMetadata(objId(), msg->metadata());

        switch (msg->code())
        {
        case NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA:
        {
                if (msg->isStatus())
                {
                        if (msg->isError())
                        {
                                int32_t error_code;
                                std::string reason;
                                if (!msg->decodeStatus(error_code, reason))
                                {
                                        FDB_LOG_E("onReply:fail to decode status\n");
                                        return;
                                }
                                FDB_LOG_I("onReply: status is received. msg code: %d, error code: %d, reason: %s\n",
                                        msg->code(), error_code, reason.c_str());
                        }
                        return;
                }
                NFdbTemple::NowPlayingDetails now_playing;
                CFdbProtoMsgParser parser(now_playing);
                if (msg->deserialize(parser))
                {
                        auto artist = now_playing.artist().c_str();
                        auto album = now_playing.album().c_str();
                        auto genre = now_playing.genre().c_str();
                        auto title = now_playing.title().c_str();
                        auto file_name = "";
                        if (now_playing.has_file_name())
                        {
                                file_name = now_playing.file_name().c_str();
                        }
                        auto folder_name = "";
                        if (now_playing.has_folder_name())
                        {
                                folder_name = now_playing.folder_name().c_str();
                        }
                        int32_t elapse_time = now_playing.elapse_time();
                        FDB_LOG_I("async reply: artist: %s, album: %s, genre: %s, title: %s, file name: %s, folder name: %s",
                                artist, album, genre, title, file_name, folder_name);
                        std::cout << "async from server: artist: " << artist << ", album: " << album << ", genre: " << genre << ", title:" << title << ", file name: " << file_name
                                << ", folder name: " << folder_name << std::endl;
                }
                else
                {
                        FDB_LOG_I("Error, unable to decode message\n");
                }
        }
        break;
        case NFdbTemple::FdbMediaSvcMsgId::REQ_RAWDATA:
        {
                if (msg->isStatus())
                {
                        int32_t error_code;
                        std::string reason;
                        if (!msg->decodeStatus(error_code, reason))
                        {
                                FDB_LOG_E("onReply: fail to decode status\n");
                                return;
                        }
                        FDB_LOG_I("onReply: msg code: %d, error code: %d, reason: %s\n", msg->code(), error_code, reason);
                        return;
                }

                CFdbParcelableArray<CPerson> persions;
                CFdbParcelableParser parser(persions);
                if (!msg->deserialize(parser))
                {
                        FDB_LOG_E("onReply: fail to decode from simple parser\n");
                        return;
                }
                std::ostringstream stream;
                (void)persions.format(stream);
                FDB_LOG_I("onReply:%s\n", stream.str().c_str());
                std::cout << "reply from server:" << stream.str().c_str() << std::endl;
        }
        break;
        default:
                break;
        }
}
/*注册服务器广播消息后的回复*/
void FDClient::onStatus(CBaseJob::Ptr & msg_ref, int32_t error_code, const char * description)
{
        auto msg = castToMessage<CBaseMessage*>(msg_ref);
        if (msg->isSubscribe())
        {
                if (!msg->isError())
                {
                        FDB_LOG_I("subscribe is ok, sn:%d\n", msg->sn());
                }
        }
        FDB_LOG_I("reason: %s\n", description);
}

void FDClient::printMetadata(FdbObjectId_t obj_id, const CFdbMsgMetadata * metadata)
{
        uint64_t time_c2s;
        uint64_t time_s2r;
        uint64_t time_r2c;
        uint64_t time_total;
        CFdbMessage::parseTimestamp(metadata, time_c2s, time_s2r, time_r2c, time_total);
        FDB_LOG_I("obj:%d, server:%llu, reply:%llu, receive:%llu, total:%llu\n",
                obj_id, time_c2s, time_s2r, time_r2c, time_total);
}

/*周期性地向服务器发送请求*/
CInvokeTimer::CInvokeTimer(FDClient *client)
        :CMethodLoopTimer<FDClient>(1000, true, client, &FDClient::callServer)
{}

使用特权

评论回复
6
keer_zu|  楼主 | 2022-9-16 18:24 | 只看该作者
3.main.cpp  (客户端)
#include "FDClient.h"

int main(int argc, char **argv)
{
        FDB_CONTEXT->start();
        fdbLogAppendLineEnd(true);
        FDB_CONTEXT->registerNsWatchdogListener([](const tNsWatchdogList &dropped_list)
        {
                for (auto it = dropped_list.begin(); it != dropped_list.end(); ++it)
                {
                        FDB_LOG_F("Error!!! name: %s, pid: %d\n", it->mClientName.c_str(), it->mPid);
                }
        });
        FDClient::main_worker.start();

        //for (int i = 1; i < argc; ++i)
        //{
        /*客户端向server_name服务器发起连接请求*/
                std::string server_name = "myService";
                std::string url(FDB_URL_SVC);
                url += server_name;
                server_name += "_client";
                auto client = new FDClient(server_name.c_str(), &FDClient::main_worker);

                client->enableReconnect(true);
                client->enableUDP(true);
                client->enableTimeStamp(true);
                client->connect(url.c_str());
        //}
                std::cout << url.c_str() << std::endl;
                std::cout << server_name << std::endl;
        CBaseWorker background_worker;
        background_worker.start(FDB_WORKER_EXE_IN_PLACE);
        return 0;
}

使用特权

评论回复
7
keer_zu|  楼主 | 2022-9-16 18:24 | 只看该作者
三、接口说明
1. CBaseLoopTimer(int32_t interval, bool repeat = false)

注: Interval代表Timer的时间间隔;

repeat表示创建的是cyclic Timer还是one-shot Timer;一旦使能后,cyclic Timer会以interval毫秒为周期反复执行;one-shot Timer在interval毫秒超时后不再执行。

2. attach(CBaseWorker *worker, bool enb = true)

注: 指定运行Timer的Worker。只有指定了Worker后Timer才能开始工作。超时后,Timer的run()函数将在该Worker上执行。 如果enb为true,Timer立刻开始在指定的Worker上执行;否则可以将来用enable()启动。

3.enable(int32_t interval = -1)

注:使能Timer。使能后的Timer将在指定的Worker上工作。如果调用该函数时Timer正在运行,那么超时时间将被重置为interval毫秒之后。

备注:代码中关于protobuf部分是与通信相关的,可以不用过多关注,当用于实际项目时,根据实际情况定义响应的protobuf数据就可以。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1350

主题

12427

帖子

53

粉丝