当前位置: 首页 > news >正文

RpcProvider发送Rpc服务一

 OnMessage函数用于处理连接到服务端的请求,接收到的buffer数据通过protobuf进行反序列化为rpcreader类,从而得到服务类和服务方法的名字。

在此期间为了防止出现,粘包问题,在buffer中以此格式存放数据:”11helloworld4mess“,通过读取前四个字节来获取头部的长度为11字节。然后取前11个字节的数据,进行反序列化得到相应的值。再根据序列化的值会得到4从而得到最后“mess”。

void RpcProvider::OnMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buffer, muduo::Timestamp)
{// 网络上接收的远程rpc调用请求的字符流    Login argsstd::string recv_buf = buffer->retrieveAllAsString();// 从字符流中读取前4个字节的内容uint32_t header_size = 0;recv_buf.copy((char*)&header_size, 4, 0);// 根据header_size读取数据头的原始字符流,反序列化数据,得到rpc请求的详细信息std::string rpc_header_str = recv_buf.substr(4, header_size);mprpc::RpcHeader rpcHeader;std::string service_name;std::string method_name;uint32_t args_size;if (rpcHeader.ParseFromString(rpc_header_str)){// 数据头反序列化成功service_name = rpcHeader.service_name();method_name = rpcHeader.method_name();args_size = rpcHeader.args_size();}else{// 数据头反序列化失败std::cout << "rpc_header_str:" << rpc_header_str << " parse error!" << std::endl;return;}// 获取rpc方法参数的字符流数据std::string args_str = recv_buf.substr(4 + header_size, args_size);// 打印调试信息std::cout << "============================================" << std::endl;std::cout << "header_size: " << header_size << std::endl; std::cout << "rpc_header_str: " << rpc_header_str << std::endl; std::cout << "service_name: " << service_name << std::endl; std::cout << "method_name: " << method_name << std::endl; std::cout << "args_str: " << args_str << std::endl; std::cout << "============================================" << std::endl;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 速盾:cdn可以定时刷新缓存吗?
  • Cesium初探-CallbackProperty
  • 推荐系统与搜索系统架构
  • MySQL --- 内置函数介绍
  • 常见面试题(一)
  • Loki配置存储有效期
  • 【Python】数据类型之列表(下)
  • PCIe学习笔记(16)
  • 《pygame游戏开发实战指南》第四节 认识Recct对象
  • 测试GPT4o分析巴黎奥运会奖牌数据
  • 【数据驱动领域EI会议推荐】2024年智能电力系统与数据驱动创新国际研讨会(IPSDDI 2024)
  • 软件设计师笔记-网络基础知识
  • 牛客JS题(二十二)数组过滤
  • Router路由的使用
  • Hadoop的安装和使用-2024年08月01日
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 07.Android之多媒体问题
  • gf框架之分页模块(五) - 自定义分页
  • Java教程_软件开发基础
  • Java小白进阶笔记(3)-初级面向对象
  • linux安装openssl、swoole等扩展的具体步骤
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React中的“虫洞”——Context
  • Shadow DOM 内部构造及如何构建独立组件
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 一、python与pycharm的安装
  • 移动端 h5开发相关内容总结(三)
  • 原生Ajax
  • 怎么把视频里的音乐提取出来
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #APPINVENTOR学习记录
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (1)Hilt的基本概念和使用
  • (4)STL算法之比较
  • (C语言)共用体union的用法举例
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Qt) 默认QtWidget应用包含什么?
  • (ZT)出版业改革:该死的死,该生的生
  • (分布式缓存)Redis哨兵
  • (九)One-Wire总线-DS18B20
  • (力扣)1314.矩阵区域和
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)库存超卖案例实战——优化redis分布式锁
  • (算法)区间调度问题
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 使用配置文件