Qt6.5 grpc组件使用 + golang grpc server示例详解
作者:听我一言 发布时间:2024-02-07 21:25:12
1. 资料
1) Protobuf 开发文档
https://protobuf.dev/
2) protobuf安装指南
https://grpc.io/docs/protoc-installation/
3) protoc 下载
https://github.com/protocolbuffers/protobuf/releases/tag/v23.1
2. Qt grpc 组件 & 工具
1) Qt6.5 安装目录下 xx\Qt\6.5.0\mingw_64\bin
i. qtgrpcgen.exe 将proto转成Qt 库 的 grpc客户端
ii. qtprotobufgen.exe 将proto转成带Qt封装的 的 protobuf接口
2) 指令使用
helloworld.proto 文件
syntax = "proto3";
package helloworld;
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
option go_package = "proto/helloworld";
1) 生成Qt封装的protobuf接口
protoc.exe --plugin=protoc-gen-qtprotobuf=E:\qt599\Qt\6.5.0\mingw_64\bin\qtprotobufgen.exe -I “D:/workspace/Qt/grpc_test/common” --qtprotobuf_out=“D:/workspace/Qt/grpc_test/common” “D:/workspace/Qt/grpc_test/common/helloworld.proto”
2) 生成Qt grpc客户端
protoc --plugin=protoc-gen-qtgrpc=E:/qt599/Qt/6.5.0/mingw_64/bin/qtgrpcgen.exe --qtgrpc_out=“D:/workspace/Qt/grpc_test/common” -I “D:/workspace/Qt/grpc_test/common” “D:/workspace/Qt/grpc_test/common/helloworld.proto”
3) 客户端调用代码
#include <QCoreApplication>
#include <QGrpcInsecureChannelCredentials>
#include "helloworld_client.grpc.qpb.h"
#include <QGrpcHttp2Channel>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
helloworld::HelloService::Client client;
auto channel = std::shared_ptr<QAbstractGrpcChannel>(new QGrpcHttp2Channel(
QUrl("http://localhost:50051",
QUrl::StrictMode),
QGrpcInsecureChannelCredentials()
| QGrpcInsecureCallCredentials()));
client.attachChannel(channel);
helloworld::HelloRequest req;
helloworld::HelloResponse rep;
req.setName("gray");
QGrpcStatus status = client.SayHello(req, &rep);
qDebug() << "Request Result: " << status.code() << status.message();
qDebug() << "REP : " << rep.message();
return a.exec();
}
3. Golang服务端
1) 生成golang 带grpc接口文件
protoc.exe -I D:/workspace/Qt/grpc_test/common --proto_path=“D:/workspace/grpc/protoc/include/google/protobuf” --plugin=protoc-gen-go=D:/workspace/grpc/protoc/bin/protoc-gen-go.exe --go_out=plugins=grpc:D:/workspace/Qt/grpc_test/common D:/workspace/Qt/grpc_test/common/helloworld.proto
2) 示例代码
再创建一个main.go,调用函数RunServer即可
package proto
import (
context "context"
"flag"
"fmt"
"log"
"net"
grpc "google.golang.org/grpc"
)
var (
port = flag.Int("port", 50051, "The server port")
)
type Server struct {
HelloServiceServer
}
// SayHello implements helloworld.GreeterServer
func (s *Server) SayHello(ctx context.Context, in *HelloRequest) (*HelloResponse, error) {
fmt.Printf("Received: %v\n", in.GetName())
return &HelloResponse{Message: "Hello " + in.GetName()}, nil
}
func RunServer() error {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
RegisterHelloServiceServer(s, &Server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
return err
}
4. 介绍一下Qt6.5支持哪些grpc功能
由Qt6.5 帮助文档可知道, 现在Qt6.5只封装支持了客户端,服务端暂未支持;
来源:https://blog.csdn.net/halo_hsuh/article/details/130815730
猜你喜欢
- 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数
- PyQt5访问系统剪切板QClipboard类介绍QClipboard类提供了对系统剪切板的访问,可以在应用程序之间复制和粘贴数据,它的操作
- 本文实例讲述了python网络编程之读取网站根目录的方法,分享给大家供大家参考。具体实现方法如下:import socket, sys po
- 要随机生成字符串代码如下:在MySQL中定义一个随机串的方法,然后再SQL语句中调用此方法。随机串函数定义方法:CREATE DEFINER
- pandas将表中的字符串转成数值型在用pd.read_csv读数据时,将要转换数据类型的列名和类型名构成字典,传给dtypeimport
- python正则模块re中findall和finditer两者相似,但却有很大区别。 两者都可以获取所有的匹配结果,这和searc
- 非阻塞IO(non-blocking IO)Linux下,可以通过设置socket使其变为non-blocking。当对一个non-bloc
- <form action="calscore.asp?action=do" met
- Runtime包GOMAXPROCS()用来设置可以并行计算的CPU核数最大值,并返回之前的值,具体使用方法上一篇有些,这里不再赘述Gosc
- 本文实例为大家分享了Tensorflow实现神经网络拟合线性回归的具体代码,供大家参考,具体内容如下一、利用简单的一层神经网络拟合一个函数
- python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序、去重,字典排序,字典、列表、字符串互转,时间对象操作
- 平时在写asp代码的时候有很多重复的内容要写,麻烦的要命,比如在收集表单提交的数据时,特别是表单的输入域比较多时,要不断写好多的reques
- 在大多数场景中,我们都用 lxml 库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用
- 在 Java 中打印当前线程的方法栈,可以用 kill -3 命令向 JVM 发送一个 OS 信号,JVM 捕捉以后会自动 dump 出来;
- 问题描述我正在用Python 3.4.1来构建一个Django项目。 manage.py runserver 引发Uni
- 本文实例讲述了Python线性拟合实现函数与用法。分享给大家供大家参考,具体如下:1. 参考别人写的:#-*- coding:utf-8 -
- 通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询。例如下面这个SQL:SELECT * FRO
- 一、cv2.contourArea起初使用该函数的时候看不懂返回的面积,有0有负数的,于是研究了一下。opencv计算轮廓内面积函数使用的是
- 引言使用python接口来运行caffe程序,主要的原因是python非常容易可视化。所以不推荐大家在命令行下面运行python程序。如果非
- 本文实例讲述了Python使用百度翻译开发平台实现英文翻译为中文功能。分享给大家供大家参考,具体如下:#coding=utf8import