grpc流式传输示例(c++)-创新互联
目录
十年的启东网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整启东建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“启东网站设计”,“启东网站推广”以来,每个客户项目都认真落实执行。grpc理解
流式传输方式
Attention
grpc理解
grpc是结合protobuf的远程调用框架,服务端和客户端均支持同步和异步模式。同步模式下,服务器的service函数会阻塞,且当前线程不能再服务其它的client,类似于多线程模式,一个线程服务一个client,可通过ResourceQuota设置大线程数;异步模式下,grpc提供类似poll方式管理事件,用户注册事件,并接收通知,一个线程管理一个CompletionQueue,通过轮询管理clients,线程模型可以用户自定义,在追求性能的情况下官方推荐异步模式。
grpc::ResourceQuota resource_quata;
resource_quata.SetMaxThreads(2);
builder.SetResourceQuota(resource_quata);
流式传输方式grpc自定义的service函数可以定义流式的参数和返回值,对应的函数实现通过Reader,Writer,ReaderWriter实现用户自定义的逻辑,从而减少内存的使用,同时在部分数据到来时就可以进行数据处理。
proto文件
syntax="proto3";
package support;
service SupportGenerator{
rpc GenSupport(stream STL) returns( stream STL){}
}
message Point{
float x=1;
float y=2;
float z=3;
}
message STL {
repeated Point points=1;
}
服务端的代码如下
#pragma once
#include#include#include"support.grpc.pb.h"
#include"support.pb.h"
//server impl
class SupportGeneratorService final :public support::SupportGenerator::Service
{
public://important
grpc::Status GenSupport(grpc::ServerContext* context, grpc::ServerReaderWriter* stl_reader_writer) override
{
vectorstls_; //recv
vectorvertics_;//recv
vectorcoordinates_;//recv
support::STL stl;//send
while (stl_reader_writer->Read(&stl))
{
google::protobuf::RepeatedPtrFieldpoints = stl.points();
CoutInLine("recieved from client ", points.size());
stls_.emplace_back(stl);
for (auto& point : points)
{
vertics_.push_back(point);
coordinates_.push_back(point.x());
coordinates_.push_back(point.y());
coordinates_.push_back(point.z());
}
}
//return the request stl
//for (auto stl_recieved : stls_)
//{
// stl_reader_writer->Write(stl_recieved);
//}
//return grpc::Status::OK;
//handle
#pragma region handle request
#pragma endregion
auto support_vertics = what you return ;
int once_count = 100;
int loop_count = support_vertics.size() / once_count + 1;
int index = 0;
for (int loop = 0; loop< loop_count; loop++)
{
support::STL stl;
for (int j = 0; j< once_count && index< support_vertics.size(); j++)
{
auto vertic = support_vertics[index++];
auto point = stl.add_points();
point->set_x(vertic.x);
point->set_y(vertic.y);
point->set_z(vertic.z);
}
stl_reader_writer->Write(stl);
}
return grpc::Status::OK;
}
};
class HServer
{
public:
HServer()
{
grpc::ServerBuilder builder;
builder.AddListeningPort("0.0.0.0:5000", grpc::InsecureServerCredentials());
builder.RegisterService(&support_generator_service_);
//对于同步server 的资源管理
grpc::ResourceQuota resource_quata;
resource_quata.SetMaxThreads(2);
builder.SetResourceQuota(resource_quata);
server_ = builder.BuildAndStart();
}
~HServer()
{
Stop();
}
void RunBackground();
void Stop();
private:
unique_ptrserver_;
SupportGeneratorService support_generator_service_;
};
客户端代码
std::shared_ptrchannel = grpc::CreateChannel("127.0.0.1:5000", grpc::InsecureChannelCredentials());
std::unique_ptrstub = support::SupportGenerator::NewStub(channel);
while (true)
{
getchar();
grpc::ClientContext client_context;
std::shared_ptr>client_reader_writer(stub->GenSupport(&client_context));
//recieved
std::vectorpoints;
//read stl
int n_vertics = vertics.size();
int once_count = 100;
int loop_count = n_vertics / once_count + 1;
int index = 0;
for (int loop = 0; loop< loop_count; loop++)
{
auto vertics = ReadStl("");//vertics should be read once_count every time in loop
support::STL stl;
for (int i = 0; i< once_count && indexset_x(vertics[index].x());
point->set_y(vertics[index].y());
point->set_z(vertics[index].z());
index++;
}
client_reader_writer->Write(stl);
std::cout<< "client write stl "<< loop<<" "<WritesDone();
std::cout<< "write done "<Read(&stl))
{
auto points_once = stl.points();
for (auto& point : points_once)
{
points.emplace_back(point);//get all data in memory
}
Save("", points_once);//save by many times can reduce memory usage
std::cout<< "recieved from server "<
Attentionprotobuf 二进制序列化和反序列化需要protoc可执行文件产生序列化对象的相关代码;与grpc结合需要grpc自带的对应编程语言的插件产生服务基类的相关代码,二者版本需要相容。直接通过grpc安装protobuf。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站名称:grpc流式传输示例(c++)-创新互联
网址分享:http://ybzwz.com/article/dsjspg.html