首页 > 编程语言 >grpc demo python客户端 c++服务端

grpc demo python客户端 c++服务端

时间:2022-10-31 16:11:05浏览次数:37  
标签:code proto grpc demo c++ test include gen

项目需啊将网站上传的图片传入c++推理引擎,网站使用flask架构,python编写,图片推理引擎是一个单独的server,c++编写,因此用grpc来传输比较合适。理论上来说只要规定好proto文件,即使语言不通也是可以实现客户端和服务端的交互的。下面是一个简单的demo,结构如下。

 

 客户端和服务端的proto文件是一致的,其实最好就用一个文件,把它放在上级目录中,这里图方便就复制了一份,下面是test.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.example.test";
option java_outer_classname = "TestProto";
option objc_class_prefix = "HLW";

package test;

message Data { int32 data = 1; }

message ReplyMsg { string message = 1; }

service CommunicationTest {
  rpc getData(Data) returns (ReplyMsg) {}
}

c++ server生成grpc代码的脚本

# mkdir gen_code
/usr/local/bin/protoc --version
/usr/local/bin/protoc -I ./ --grpc_out=./gen_code --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ./test.proto
/usr/local/bin/protoc -I ./ --cpp_out=./gen_code ./test.proto

python client生成grpc代码的脚本

python -m grpc_tools.protoc -I ./ --python_out=./gen_code --grpc_python_out=./gen_code ./test.proto

c++ server端代码

#include <grpc/grpc.h>
#include <grpcpp/security/server_credentials.h>
#include <grpcpp/server.h>
#include <grpcpp/server_builder.h>
#include <grpcpp/server_context.h>

#include <iostream>
#include <string>
#include <memory>

#include "./gen_code/test.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::ServerReader;
using grpc::ServerReaderWriter;
using grpc::ServerWriter;
using grpc::Status;

class TestImpl final : public test::CommunicationTest::Service
{
public:
    grpc::Status getData(grpc::ServerContext *context, const test::Data *data, test::ReplyMsg *msg) override
    {
        std::cout << "grpc get data: " << data->data() << std::endl;
        std::string tmp("data received successful, this is reply message");
        msg->set_message(tmp);
        return grpc::Status::OK;
    }
};

void RunServer()
{
    TestImpl service;
    grpc::ServerBuilder builder;
    builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials());
    builder.RegisterService(&service);

    std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
    std::cout << "Server listening on 0.0.0.0:50051" << std::endl;
    server->Wait();
}

int main(int argc, char **argv)
{
    RunServer();
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(test)

find_package(Threads REQUIRED)
find_package(Protobuf CONFIG REQUIRED)

set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
set(_REFLECTION gRPC::grpc++_reflection)

find_package(gRPC REQUIRED)
set(_GRPC_GRPCPP gRPC::grpc++)

# proto file
get_filename_component(test_proto "../test.proto" ABSOLUTE)
get_filename_component(test_proto_path "${test_proto}" PATH)

# generated sources
include_directories("${CMAKE_CURRENT_BINARY_DIR}/../gen_code")
set(test_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/../gen_code/test.pb.cc")
set(test_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/../gen_code/test.pb.h")
set(test_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/../gen_code/test.grpc.pb.cc")
set(test_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/../gen_code/test.grpc.pb.h")

# hw_grpc_proto
add_library(hw_grpc_proto
  ${test_grpc_srcs}
  ${test_grpc_hdrs}
  ${test_proto_srcs}
  ${test_proto_hdrs})
target_link_libraries(hw_grpc_proto
  ${_REFLECTION}
  ${_GRPC_GRPCPP}
  ${_PROTOBUF_LIBPROTOBUF})

foreach(_target
  test_server test_client
  )
  add_executable(${_target} "${_target}.cc")
  target_link_libraries(${_target}
    hw_grpc_proto
    ${_REFLECTION}
    ${_GRPC_GRPCPP}
    ${_PROTOBUF_LIBPROTOBUF})
endforeach()

python client代码

from __future__ import print_function

import logging
import grpc
from gen_code import test_pb2, test_pb2_grpc

def run():
    print("Will try python grpc test")
    input_data = input("input message: ")
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = test_pb2_grpc.CommunicationTestStub(channel)
        response = stub.getData(test_pb2.Data(data=int(input_data)))
    print("test client received: "+ response.message)

if __name__ == '__main__':
    logging.basicConfig()
    run()

 

 

 

 结果如图

标签:code,proto,grpc,demo,c++,test,include,gen
From: https://www.cnblogs.com/wangtianning1223/p/16844671.html

相关文章

  • gRPC - Debug - Channel ManagedChannelImpl was not shut down properly
    问题描述生产代码报错:2022-10-31T09:06:46,530[portRiskService-1002-2950@168-63-70-238:8]ERRORio.grpc.internal.ManagedChannelOrphanWrapper-*~*~*~Channel......
  • Demo1
    publicclassHelloWorld{//public目前是起限制作用,限制文件名和类名保持一致,否则不会运行。//class:定义的一个类.后面定义该类的名称类就如一栋大楼。......
  • C++&Python 描述 LeetCode 1.两数之和
    C++&Python描述LeetCode1.两数之和  大家好,我是亓官劼(qíguānjié),在【亓官劼】公众号、、GitHub、B站、华为开发者论坛等平台分享一些技术博文。放弃不难,但坚持......
  • 【以练促学】(C++基础语法)数组篇
    (持续刷题持续更新...) 1.区分int*p=newint;//用new开辟了一个整型存储空间,并将该空间地址赋给pint*p=newint(10);//用new开辟了一个整型存储空间,......
  • C++对象模型:g++的实现(四)
    这篇博客开始总结《深度探索C++对象模型》的第四章,即C++中成员函数(除了构造函数和析构函数)相关的内容。介绍了C++类中的成员函数,包括常规成员函数、虚函数、静态函数。其......
  • C++——STL库——reverse、remove、remove_if
    1.reverse函数使用函数功能:将序列[first,last)的元素在原容器中颠倒重排,包含在algorithm库中reverse没有返回值时间复杂度为O(n)示例1:交换vector容器中元素的顺序vect......
  • C/C++ Note
    本文作为学习笔记,并不作商业用途。如下文内容有侵权等行为请联系博主删除==========================================================BitwiseOperationSimpleTalkC......
  • C++Builder(BCB)6.0若干提示、编程须知
    1、【工具——编辑器选项】可以设置代码编辑窗口的一些选项,比如设置字体和大小,【Tab键停留】和【空白缩进】默认可以改为4(对笔记本小屏幕很重要),等等。2、代码编辑有用的......
  • QML 怎么调用 C++ 中的内容?
    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ先说明一下测试环境编译器:vs2017x64开发......
  • C++11绑定器bind及function机制
    前言之前在学muduo网络库时,看到陈硕以基于对象编程的方式,大量使用boost库中的bind和function机制,如今,这些概念都已引入至C++11,包含在头文件<functional>中。本篇文章主要......