FDBUS学习笔记

FDBUS需要用到protobuf,所以需要提前安装好protobuf。

protobuf下载地址:

GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange formathttps://github.com/protocolbuffers/protobuf下载好后安装到环境,安装可自行百度,或参考如下网址

protobuf 安装 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/160249058(protoc --cpp_out=./ *.proto 可以吧proto文件编译成cc和h文件,用于后续加入fdbus工程使用。)

fdbus下载地址:

fdbus: Fast Distributed Bus (FDBus) (gitee.com)https://gitee.com/jeremyczhen/fdbus下载好之后,根据指导文档编译即可,编译文档如下网址:

Introduction — FDbus 1.0 documentationhttps://fdbus.readthedocs.io/en/latest/readme.html#for-ubuntu-host-version-running-at-host-machine编译好之后如下,(这里我使用ubuntu的g++/gcc 直接编译):

先启动 name_server

然后可以启动 fdbxserver 和 fdbxclient  就可以看到有打印信息

FDBUS学习笔记_第1张图片

说明编译没问题,而且fdbus相应的功能都能用了。最后make install 将相关文件安装到指定目录。

接下来,如何开发自己的fdbus工程。

fdbus文件夹中有很多server和client的例子,这里我们可以参考example下的 server 和 client 相关源码去构建自己的代码。

server 头文件:

#ifndef __FDBSERVER_H__ 
#define __FDBSERVER_H__

#include "fdbDemo.pb.h"
#include 
#include 

static CBaseWorker main_worker;

class CMediaServer : public CBaseServer
{
public:
    CMediaServer(const char *name, CBaseWorker *worker = nullptr);

    void onOnline(FdbSessionId_t sid, bool is_first);
    
    void onOffline(FdbSessionId_t sid, bool is_last) {}

    /* called when client calls invoke() */
    void onInvoke(CBaseJob::Ptr &msg_ref);

    /* called when client call subscribe() to register message */
    void onSubscribe(CBaseJob::Ptr &msg_ref);
};

#endif ///__FDBSERVER_H__

client 头文件:

#ifndef __FDBCLIENT_H__ 
#define __FDBCLIENT_H__

#include "fdbDemo.pb.h"
#include 
#include 

static CBaseWorker main_worker;

class CMediaClient : public CBaseClient
{
public:
    CMediaClient(const char *name, CBaseWorker *worker = nullptr);

    /* called when connected to the server */
    void onOnline(FdbSessionId_t sid, bool isFirst);

    /* called when disconnected from server */
    void onOffline(FdbSessionId_t sid, bool isLast);

    /* called when events broadcasted from server is received */
    void onBroadcast(CBaseJob::Ptr &msgRef);
};
#endif ///__FDBCLIENT_H__

 Server和Client端把自己需要的几个基本函数都列出来,然后实现。

具体实现可以参考fdbus的example。

最后贴上我这边工程目录及CMakeList

#cmake最小需要版本
cmake_minimum_required(VERSION 3.0)
#项目名字
project(fdbDemo)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/fdbus/include
                    ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/include
                    ${CMAKE_CURRENT_SOURCE_DIR}/proto)

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/proto PROTO)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source/fdbserver FDBSERVER)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source/fdbclient FDBCLIENT)

LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/fdbus/lib
                 ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/protobuf/lib)

set(LIB_LIST protobuf common_base pthread)

#编译参数
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS} -O2 -s")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -g -Wall -O2 -s")

ADD_EXECUTABLE(fdbServer ${FDBSERVER} ${PROTO})
TARGET_LINK_LIBRARIES(fdbServer ${LIB_LIST})

ADD_EXECUTABLE(fdbClient ${FDBCLIENT} ${PROTO})
TARGET_LINK_LIBRARIES(fdbClient ${LIB_LIST})

FDBUS学习笔记_第2张图片

有以下注意点:

1. fdbus和protobuf尽量不要直接装在ubuntu环境里,建一个install文件夹,装进去,工程建立需要就去相应的路径找

2. 把proto文件生成的 cc文件也要编译到工程执行文件里。不编译的话,会报一堆 undefined reference 的错误。

2. 注意写CMakeList的时候,链接protobuf库 不要链接protobuf-lite,否则,invoke或broadcast builder的时候会报错。(不知道是否有解决办法,我这边换成用protobuf去链接,就没有任何错误了)

你可能感兴趣的:(网络协议)