MPRPC项目(第九天,新增服务以及controller实现)

一、新增服务提供

两个都与用户登录没有什么区别

1、friend.proto

syntax = "proto3"; package fixbug; option cc_generic_services = true; message ResultCode{ int32 errcode = 1; bytes errmsg = 2; } message GetFriendListRequest{ uint32 userid = 1; } message GetFriendListResponse{ ResultCode result = 1; repeated bytes friends = 2; } service FriendServiceRpc{ rpc GetFriendList(GetFriendListRequest) returns(GetFriendListResponse); }

要新建一个proto文件。

2、服务端

#include<iostream> #include<string> #include"friend.pb.h" #include"mprpcapplication.h" #include"rpcprovider.h" #include<vector> class FriendService : public fixbug::FriendServiceRpc { public: std::vector<std::string> GetFriendList(uint32_t userid){ std::cout << "do GetFriendList service" << std::endl; std::vector<std::string> vec; vec.push_back("zhangsan"); vec.push_back("lisi"); vec.push_back("wangwu"); return vec; } void GetFriendList(::google::protobuf::RpcController* controller, const ::fixbug::GetFriendListRequest* request, ::fixbug::GetFriendListResponse* response, ::google::protobuf::Closure* done){ uint32_t userid = request->userid(); std::vector<std::string> friendlist = GetFriendList(userid); response->mutable_result()->set_errcode(0); response->mutable_result()->set_errmsg(""); //把好友列表序列化,写入到response的friends字段中,返回给客户端 //inline std::string* GetFriendListResponse::add_friends(); for(std::string &name : friendlist){ std::string *p = response->add_friends(); *p = name; } done->Run(); } }; int main(int argc, char **argv){ //调用框架的初始化操作 MprpcApplication::Init(argc,argv); //provider是一个rpc网络服务对象,把FriendService对象发布到rpc节点上 RpcProvider provider; provider.NotifyService(new FriendService()); //启动rpc服务发布节点 Run以后,进程进入阻塞状态,等待远程的rpc调用请求 provider.Run(); return 0; }

3、消费端

#include<iostream> #include "friend.pb.h" #include"mprpcapplication.h" int main(int argc,char **argv){ //整个程序启动后,想用mprpc框架调用rpc服务,一定要先调用框架的初始化函数(只初始化一次) MprpcApplication::Init(argc,argv); //演示远程调用发布的rpc方法 Login fixbug::FriendServiceRpc_Stub stub(new MprpcChannel()); fixbug::GetFriendListRequest request; request.set_userid(1); //RPC方法的响应 fixbug::GetFriendListResponse response; MprpcController controller; //发起rpc方法的调用 同步的rpc调用过程 MprpcChannel::callmethod stub.GetFriendList(&controller, &request, &response, nullptr); //一次rpc调用完整,读取调用结果 //0表示成功,非0表示错误 如404,not found if(controller.Failed()){ std::cout<<controller.ErrorText()<<std::endl; }else{ if(response.result().errcode() == 0){ std::cout<<"rpc GetFriendList response success! "<<std::endl; for(int i = 0; i < response.friends_size(); i++){ std::cout<<"name"<<i<<": "<<response.friends(i)<<std::endl; } }else{ std::cout<<"rpc GetFriendList response failed: "<<response.result().errcode()<<" msg: "<<response.result().errmsg()<<std::endl; } } return 0; }

这里新增了controller,让服务端能够获得错误信息,无论是出现在服务端还是消费端的。

二、controller实现

该对象是Protobuf RPC框架中用于错误报告和调用控制的核心组件,它使得上层应用能够获知RPC调用过程中发生的各种错误情况,是RPC调用结果反馈的重要机制。

类似于以下用法,在mprpcchannel.cc里修改错误输出,设置出错后,在消费端就能获得。

char errtxt[512] = {0}; sprintf(errtxt,"connect failed!errno : %d",errno); controller->SetFailed(errtxt);

1、mprpccontroller.h

#pragma once #include<google/protobuf/service.h> #include<string> class MprpcController:public google::protobuf::RpcController{ public: MprpcController(); void Reset(); bool Failed() const; std::string ErrorText() const; void SetFailed(const std::string& reason); //目前未实现具体的功能 void StartCancel(); bool IsCanceled() const; void NotifyOnCancel(google::protobuf::Closure* callback); private: bool m_failed;//RPC方法执行过程中的状态 std::string m_errText;//rpc方法执行过程中的错误信息 };

2、mprpccontroller.cc

#include "mprpccontroller.h" //初始化 MprpcController::MprpcController(){ m_failed = false; m_errText = ""; } //重置 void MprpcController::Reset(){ m_failed = false; m_errText = ""; } //判断是否成功 bool MprpcController::Failed() const{ return m_failed; } //返回错误信息 std::string MprpcController::ErrorText() const{ return m_errText; } //发生错误 void MprpcController::SetFailed(const std::string& reason){ m_failed = true; m_errText = reason; } //目前未实现具体的功能 void MprpcController::StartCancel(){} bool MprpcController::IsCanceled() const{return false;} void MprpcController::NotifyOnCancel(google::protobuf::Closure* callback){}

====

这里附上代码,这两次的都没添加

https://github.com/wky-2004/exp1/tree/master/MPRPC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1099154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CUDA安装成功但torch.version.cuda为空?重装PyTorch试一试

CUDA安装成功但torch.version.cuda为空&#xff1f;重装PyTorch试一试 在深度学习开发中&#xff0c;你是否曾遇到这样的场景&#xff1a;系统明明已经正确安装了NVIDIA驱动和CUDA工具包&#xff0c;nvidia-smi也能清晰列出GPU信息&#xff0c;可一旦进入Python环境执行import …

PCB过孔与电流对照一览表快速理解手册

过孔载流能力全解析&#xff1a;一张表看懂PCB大电流设计的关键你有没有遇到过这种情况——电路板上某个MOSFET突然烧了&#xff0c;查来查去发现不是器件问题&#xff0c;而是地回路的过孔被击穿了&#xff1f;或者在调试一个10A输出的DC-DC模块时&#xff0c;红外热像仪一扫&…

CUDA安装后ldconfig未更新?手动添加库路径解决问题

CUDA安装后ldconfig未更新&#xff1f;手动添加库路径解决问题 在部署深度学习环境时&#xff0c;你是否遇到过这样的场景&#xff1a;明明已经安装了完整的CUDA Toolkit&#xff0c;NVIDIA驱动也正常工作&#xff0c;PyTorch或TensorFlow却始终无法启用GPU&#xff1f;运行 to…

傅里叶变换杀回来了!搞定图像分割、降噪、跨域,顶刊思路赶紧跟上!

傅里叶变换作为经典的频域分析工具&#xff0c;已成为图像处理领域突破性能瓶颈的核心技术之一。其能够将图像从空域分解为频域分量&#xff0c;精准分离信号与噪声、结构与细节&#xff0c;为解决玻璃分割边界模糊、海洋雪噪声干扰、跨域分布偏移等传统难题提供了全新思路。为…

CUDA安装后nvidia-smi可用但torch.cuda.is_available()为False怎么办

CUDA安装后nvidia-smi可用但torch.cuda.is_available()为False怎么办 在深度学习开发中&#xff0c;你可能遇到过这样令人困惑的场景&#xff1a;服务器上运行 nvidia-smi 能清晰看到GPU信息&#xff0c;驱动正常加载&#xff0c;显存使用情况一目了然——一切看起来都完美无缺…

Markdown文档记录实验过程:搭配Miniconda环境变量说明

基于 Miniconda 与 Markdown 的 AI 实验可复现实践 在今天的人工智能研究中&#xff0c;一个让人哭笑不得的常见场景是&#xff1a;某位同学兴冲冲地展示训练结果&#xff0c;“模型准确率达到了98%&#xff01;”——但当其他人尝试复现时&#xff0c;却卡在环境依赖上&#x…

Android16 默认关闭touch声音

项目需要把touch声音屏蔽掉,比如触摸反馈的声音,USB触摸切换的声音。 查看Android提供的标准API: mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); private void setSoundEffectsEnabled(boolean enabled) {if (enabled) {mAudioManage…

WinDbg调试USB驱动通信过程:实战项目完整示例

深入内核&#xff1a;用 WinDbg 实战定位 USB 音频驱动延迟问题你有没有遇到过这样的场景&#xff1f;一款高保真 USB 音频设备在播放时突然“咔哒”一声&#xff0c;出现爆音或卡顿。用户反馈说“像是断了一拍”&#xff0c;而你的应用层日志却干干净净&#xff0c;没有任何错…

高等线性代数、数学分析复习大纲

高等线性代数 graph TD%% 基础核心F[数域] --> V[向量空间]V --> LI[线性无关]LI --> BASIS[基与维数]V --> LM[线性映射]LM --> IMKER[像与核]IMKER --> RNT[秩零化度定理]%% 矩阵部分BASIS -->…

Miniconda-Python3.11环境变量详解:掌握HOME、PATH等关键字段

Miniconda-Python3.11环境变量详解&#xff1a;掌握HOME、PATH等关键字段 在现代数据科学和AI开发中&#xff0c;一个常见的痛点是&#xff1a;为什么代码在我机器上跑得好好的&#xff0c;换台机器就报错&#xff1f; 问题往往不在于代码本身&#xff0c;而在于“环境”——Py…

小白也能学会的PyTorch安装教程GPU版本详细步骤

小白也能学会的PyTorch安装教程GPU版本详细步骤 在如今深度学习遍地开花的时代&#xff0c;无论是做图像识别、语音合成还是大模型训练&#xff0c;几乎都绕不开一个名字——PyTorch。它以简洁直观的设计和强大的 GPU 加速能力&#xff0c;成了科研圈和工业界的“香饽饽”。但对…

企业级AI开发规范:基于Miniconda的环境声明式配置方案

企业级AI开发规范&#xff1a;基于Miniconda的环境声明式配置方案 在当今AI研发节奏日益加快的背景下&#xff0c;一个看似微不足道却频繁引发项目延误的问题正困扰着无数团队——“为什么我的代码在你机器上跑不起来&#xff1f;”这个问题背后&#xff0c;往往不是算法逻辑错…

基于STM32的LED阵列扫描控制实战案例

从零打造一个会“说话”的LED屏&#xff1a;基于STM32的汉字点阵扫描实战你有没有在地铁站、公交站或者工厂车间里&#xff0c;看到过那种滚动显示文字的红色LED屏幕&#xff1f;它们不声不响&#xff0c;却把信息传递得清清楚楚。这些看似简单的设备背后&#xff0c;其实藏着一…

GitHub Projects项目管理:跟踪Miniconda-Python3.11开发进度

GitHub Projects项目管理&#xff1a;跟踪Miniconda-Python3.11开发进度 在现代AI与数据科学项目中&#xff0c;一个常见的困境是&#xff1a;实验明明在本地运行完美&#xff0c;却在同事的机器上频频报错。这种“在我这儿能跑”的问题&#xff0c;根源往往不是代码缺陷&#…

零基础学习Proteus+单片机仿真系统搭建

从零开始搭建单片机仿真系统&#xff1a;Proteus Keil 实战入门你是否曾因为没有开发板、买不起元器件&#xff0c;或者接错线烧了芯片而放弃动手实践&#xff1f;你是否觉得单片机编程太抽象&#xff0c;写完代码却不知道“它到底跑没跑”&#xff1f;别担心——一台电脑&…

HTML动态加载PyTorch训练进度条的前端实现方法

HTML动态加载PyTorch训练进度条的前端实现方法 在深度学习项目中&#xff0c;模型训练往往需要数小时甚至数天时间。你有没有过这样的经历&#xff1a;盯着终端里不断滚动的日志&#xff0c;却无法判断“还剩多久”&#xff1f;或者远程服务器上的实验跑着跑着就断开了连接&…

C# 高效编程:Any () 与 Count () 正确选择

在 C 开发中&#xff0c;选择 Count() 还是 Any()&#xff0c;关键在于明确业务意图并理解不同集合类型与场景下的性能差异。以下是针对两者区别及最佳实践的详细分析与总结。 一、核心区别&#xff1a;设计意图与实现机制 特性Any()Count() / Count 属性设计用途判断集合中是…

手机APP远程控制LED灯:手把手教程(从零实现)

从零开始&#xff1a;用手机APP远程控制LED灯&#xff0c;实战全解析你有没有想过&#xff0c;不碰墙壁开关&#xff0c;只在手机上滑动一下&#xff0c;就能让家里的灯变亮或熄灭&#xff1f;这听起来像是智能家居广告里的场景&#xff0c;但其实——你自己也能做出来。今天我…

PyTorch Lightning集成:在Miniconda-Python3.11中简化训练代码

PyTorch Lightning集成&#xff1a;在Miniconda-Python3.11中简化训练代码 你有没有遇到过这样的场景&#xff1f;好不容易复现一篇论文的模型&#xff0c;代码跑起来却报错&#xff1a;torch not found、CUDA version mismatch&#xff0c;或者更糟——“在我机器上明明能跑”…

将PyTorch训练脚本打包进Miniconda-Python3.11镜像发布到GitHub

将 PyTorch 训练脚本打包进 Miniconda-Python3.11 镜像并发布到 GitHub 在深度学习项目中&#xff0c;最让人头疼的往往不是模型调参&#xff0c;而是“在我机器上能跑”——这句话背后隐藏的是环境不一致、依赖冲突和版本错配的噩梦。尤其当团队协作或开源共享时&#xff0c;如…