Cyber-服务通信

 

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


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

    步骤:
        消息载体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


*/

 

 

编译通过的代码

csmsg.proto

syntax = "proto2";

package apollo.cyber.demo_base_proto;

message Request{

    required int64 a = 1;
    required int64 b = 2;
}

message Response{

    required int64 sum = 1;
}
View Code

proto的build

proto_library(
    name = "csmsg_proto_lib",
    srcs = ["csmsg.proto"],
)

cc_proto_library(
    name = "csmsg_proto_cc_lib",
    deps = [":csmsg_proto_lib"],
)
View Code

server.cc

#include "cyber/cyber.h"
#include "cyber/demo_base_proto/csmsg.pb.h"

using apollo::cyber::demo_base_proto::Request;
using apollo::cyber::demo_base_proto::Response;

void callback(const std::shared_ptr<Request>& request, const std::shared_ptr<Response>& response) {
    int64_t a = request->a();
    int64_t b = request->b();
    int64_t sum = a + b;
    AINFO << "recv a = " << a << ", b = " << b;
    AINFO << "response sum = " << sum;
    response->set_sum(sum);

}

int main(int argc, char* argv[])
{
    apollo::cyber::Init(argv[0]);
    AINFO << "init...";

    auto server_node = apollo::cyber::CreateNode("server_node");
    auto server = server_node->CreateService<Request, Response>("/cs/chatter", callback);


    apollo::cyber::WaitForShutdown();


    return 0;
}
View Code

client.cc

#include "cyber/cyber.h"
#include "cyber/demo_base_proto/csmsg.pb.h"

using apollo::cyber::demo_base_proto::Request;
using apollo::cyber::demo_base_proto::Response;

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

    apollo::cyber::Init(argv[0]);
    AINFO << "init success";

    auto client_node = apollo::cyber::CreateNode("client_node");
    auto client = client_node->CreateClient<Request, Response>("/cs/chatter");

    auto request = std::make_shared<Request>();
    request->set_a(2);
    request->set_b(5);

    apollo::cyber::Rate rate(0.5);

    while(apollo::cyber::OK())
    {
        auto response = client->SendRequest(request);
        AINFO << "response from client is " << response->sum();


        rate.Sleep();
    }

    apollo::cyber::WaitForShutdown();


    return 0;
}
View Code

cc的build

cc_binary(
    name = "server_cc_bin",
    srcs = ["server.cc"],
    deps = ["//cyber",
            "//cyber/demo_base_proto:csmsg_proto_cc_lib"],
)
cc_binary(
    name = "client_cc_bin",
    srcs = ["client.cc"],
    deps = ["//cyber",
            "//cyber/demo_base_proto:csmsg_proto_cc_lib"],
)
View Code

 

posted @ 2023-07-09 22:06  WTSRUVF  阅读(26)  评论(0)    收藏  举报