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  "<
Attention

protobuf 二进制序列化和反序列化需要protoc可执行文件产生序列化对象的相关代码;与grpc结合需要grpc自带的对应编程语言的插件产生服务基类的相关代码,二者版本需要相容。直接通过grpc安装protobuf。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:grpc流式传输示例(c++)-创新互联
网址分享:http://ybzwz.com/article/dsjspg.html