服务通信

发布时间 2023-07-09 22:13:50作者: WTSRUVF

 

/*
    服务通信:
        以请求响应的方式实现不同节点之间数据交互的通信模式
        用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景


    需求:
        客户端发送请求提交两个整型数字,服务端处理请求提取两个数字求和,并将结果响应回客户端

    步骤:
        消息载体protobuf
        服务端
        客户端
        编译并执行

*/

////////////////////////proto/////////////////////////////////////
// demo_base_proto目录下新建addints.proto


syntax = "proto2";

package apollo.cyber.demo_base_proto;

message AddInts_Request{
    requried int64 num1 = 1;
    requried int64 num2 = 2;
}

message AddInts_response{
    requried int64 sum = 1;
}

//////////////////////////////////////////////////////////////////

//////////////////////////BUILD///////////////////////////////////

proto_library(
    name = "addints_proto",
    srcs = ["addints.proto"]
)

cc_library(
    name = "addints_cc",
    deps = [":addints_proto"]
)


//////////////////////////////////////////////////////////////////

// 编译:bezal build cyber/demo_base_proto/...




///////////////////////////////服务端cpp//////////////////////////

// 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 shared_ptr<AddInts_Request>& request,
        const shared_ptr<AddInts_Response>& response){
    int64_t num1 = request->num1();
    int64_t num2 = request->num2();

    AINFO << "客户端请求num1 = " << num1 << ", num2 = " << num2;

    // 求和并设置响应

    int64_t sum = num1 + num2;
    response->set_sum(sum);
}

int main(int argc, char* argv[])
{
    apollo::cyber::Init(argv[0]);
    AINFO << "服务端执行...";

    // 创建节点
    auto server_node = apollo::cyber::CreateNode("server_node");
    // 创建服务方
    auto server = node->CreateService<AddInts_Request, AddInts_Response>("addints", cb);


    // 数据处理

    // 等待关闭
    apollo::cyber::WaitForShutdown();

    return 0;
}
/////////////////////////////////////////////////////////////////////////////

////////////////////////////服务方BUILD//////////////////////////////////////

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

// 编译:bezal build cyber/demo_cc/...
// source cyber/setup.bash  // 刷新环境变量

/////////////////////////////客户端cpp/////////////////////////////////////
// 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 arc, char* argv[])
{
    apollo::cyber::Init(argv[0]);
    if(argc != 3)
    {
        AINFO << "执行程序时请输入两个数字作为参数";
        return 1;
    }
    AINFO << "客户端...";
    // 创建节点
    auto client_node = apollo::cyber::CreateNode("client_node");
    // 创建客户端
    auto client = client_node->CreateClient<AddInts_Request, AddInts_Reponse>("addints");


    // 发送数据
    AINFO << "等待服务启动...";

    auto request = std::make_shared<AddInts_Request>();
    request->set_num1(atoll(argv[1]));
    request->set_num2(atoll(argv[2]));

    AINFO << "发送num1 = " << request->num1() << ", num2 = " << request->num2();

    auto response = client->SendRequest(request);

    // 处理响应

    AINFO << "响应结果为:" << request->sum();

    // 等待关闭
    apollo::cyber::WaitForShutdown();


    return 0;
}
////////////////////////////////////////////////////////////////////

/////////////////////////客户端BUILD////////////////////////////////

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

///////////////////////////////////////////////////////////////////

// 编译:bezal build cyber/demo_cc/...
// source cyber/setup.bash  // 刷新环境变量


/*
    执行
        ./bezal-bin/cyber/demo_cc/demo03_server_cc
        ./bezal-bin/cyber/demo_cc/demo04_client_cc


*/