2.2.1 C++实现

1.服务端实现

demo_cc 目录下新建 C++ 文件 demo03_server.cc,输入如下内容:

/*  
    需求:客户端发送请求,提交两个整数,服务端接收请求,提取数字,相加后
        将结果响应回客户端;
    实现:
        1.包含头文件;
        2.初始化;
        3.创建节点;
        4.创建服务方;
        5.数据处理;
        6.等待关闭;


*/
#include "cyber/cyber.h"
#include "cyber/demo_base_proto/addints.pb.h"

using apollo::cyber::demo_base_proto::AddInts_Request;
using apollo::cyber::demo_base_proto::AddInts_Response;
void cb(const std::shared_ptr<AddInts_Request>& request,const std::shared_ptr<AddInts_Response>& response){
    //处理请求,产生响应
    int64_t num1 = request -> num1();
    int64_t num2 = request -> num2();
    AINFO << "客户端请求num1="<< num1 << ",num2=" << num2;
    //求和并设置响应
    int16_t sum = num1 + num2;
    response->set_sum(sum);
}
int main(int argc, char *argv[])
{
    apollo::cyber::Init(argv[0]);
    AINFO << "服务端执行....";
    // 3.创建节点;
    auto server_node = apollo::cyber::CreateNode("server_node");
    // 4.创建服务方;
    auto server = server_node->CreateService<AddInts_Request,AddInts_Response>("addints",cb);   
    // 5.数据处理;

    // 6.等待关闭;
    apollo::cyber::WaitForShutdown();
    return 0;
}

配置文件BUILD添加内容如下:

cc_binary(
    name = "demo03_server",
    srcs = ["demo03_server.cc"],
    deps = [
        "//cyber",
        "//cyber/demo_base_proto:addints_proto_cc"
    ],
)

2.客户端实现

demo_cc 目录下新建 C++ 文件 demo04_client.cc,输入如下内容:

/*  
    需求:客户端发送数据并处理响应
    实现:
        1.包含头文件;
        2.初始化 cyber;
        3.创建客户端节点;
        4.创建发布方;
        5.发送数据;
        6.等待关闭。
*/
#include "cyber/cyber.h"
#include "cyber/demo_base_proto/addints.pb.h"

using apollo::cyber::demo_base_proto::AddInts_Request;
using apollo::cyber::demo_base_proto::AddInts_Response;

int main(int argc, char *argv[])
{


    apollo::cyber::Init(argv[0]);
    // 处理输入的参数   
    if (argc != 3)
    {
        AINFO << "执行程序时请输入两个数字作为参数";
        return 1;
    }

    AINFO << "客户端....";   
    // 3.创建客户端节点;
    auto client_node = apollo::cyber::CreateNode("client_node");
    // 4.创建发布方;
    auto client = client_node -> CreateClient<AddInts_Request,AddInts_Response>("addints");
    // 5.发送数据;
    AINFO << "等待服务启动";
    auto request = std::make_shared<AddInts_Request>();
    request -> set_num1(atoll(argv[1]));
    request -> set_num2(atoll(argv[2]));
    auto flag = client -> WaitForService(std::chrono::duration<long int>(10));
    // client->ServiceIsReady
    if(flag){
        AINFO << "服务已经启动";
        AINFO << "发送num1 = " << request->num1() << ",num2 = " << request->num2(); 
        auto response = client -> SendRequest(request);
        //处理响应
        AINFO << "响应结果:sum = " << response->sum();
    } else {
        AINFO << "服务未启动";
    }
    // 6.等待关闭。 
    apollo::cyber::WaitForShutdown();
    return 0;
}

配置文件BUILD添加内容如下:

cc_binary(
    name = "demo04_client",
    srcs = ["demo04_client.cc"],
    deps = [
        "//cyber",
        "//cyber/demo_base_proto:addints_proto_cc"
    ],
)

3.编译执行

编译:

bazel build cyber/demo_cc/...

执行(需要两个终端):

终端A执行发布方:

source cyber/setup.bash
./bazel-bin/cyber/demo_cc/demo03_server

终端B执行订阅方:

source cyber/setup.bash
./bazel-bin/cyber/demo_cc/demo04_client 30 50

最终运行结果与本章引言部分的案例2类似。

results matching ""

    No results matching ""