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

基于moduo库实现protobuf通信

基于moduo库实现protobuf通信

服务端:

#include "muduo/proto/codec.h"
#include "muduo/proto/dispatcher.h"#include "request.pb.h"#include "muduo/base/Logging.h"
#include "muduo/base/Mutex.h"
#include "muduo/net/EventLoop.h"
#include "muduo/net/TcpServer.h"#include <iostream>
#include <unordered_map>class Server
{public:typedef std::shared_ptr<google::protobuf::Message> MessagePtr;typedef std::shared_ptr<xyp::TranslateRequest> TranslateRequestPtr;typedef std::shared_ptr<xyp::AddRequest> AddRequestPtr;Server(int port):_server(&_baseloop,muduo::net::InetAddress("0.0.0.0",port),"Server",muduo::net::TcpServer::kReusePort),_dispatcher(std::bind(&Server::onUnknownMessage,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3)),_codec(std::bind(&ProtobufDispatcher::onProtobufMessage, &_dispatcher, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)){//注册业务请求函数_dispatcher.registerMessageCallback<xyp::TranslateRequest>(std::bind(&Server::onTranslate,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));_dispatcher.registerMessageCallback<xyp::AddRequest>(std::bind(&Server::onAdd,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));_server.setMessageCallback(std::bind(&ProtobufCodec::onMessage, &_codec, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));_server.setConnectionCallback(std::bind(&Server::onConnection,this,std::placeholders::_1));}void start(){_server.start();_baseloop.loop();}private:std::string translate(const std::string &str){static std::unordered_map<std::string,std::string> dict_map={{"hello","你好"},{"你好", "Hello"},{"thank you","谢谢"}};auto it=dict_map.find(str);if(it==dict_map.end()){return "没听懂!";}return it->second;}void onTranslate(const muduo::net::TcpConnectionPtr& conn, const TranslateRequestPtr& message,muduo::Timestamp){//1.提取message中有效信息std::string req_msg=message->msg();//2。进行翻译得到结果std::string rsp_msg=translate(req_msg);//3.组织protobuf响应xyp::TranslateResponse resp;resp.set_msg(rsp_msg);//4.发送响应_codec.send(conn,resp);}void onAdd(const muduo::net::TcpConnectionPtr& conn, const AddRequestPtr& message,muduo::Timestamp){int num1=message->num1();int num2=message->num2();int result=num1+num2;xyp::AddResponse resp;resp.set_result(result);_codec.send(conn,resp);}void onUnknownMessage(const muduo::net::TcpConnectionPtr& conn, const MessagePtr& message,muduo::Timestamp){LOG_INFO << "onUnknownMessage: " << message->GetTypeName();conn->shutdown();}   void onConnection(const muduo::net::TcpConnectionPtr&conn){if(conn->connected()){LOG_INFO<<"新连接成功!";}else{LOG_INFO<<"新连接关闭";}}private:muduo::net::EventLoop _baseloop;muduo::net::TcpServer _server;//服务器对象ProtobufDispatcher _dispatcher;//请求分发器对象,要想其中注册请求函数ProtobufCodec _codec;//protobuf协议处理器,针对收到请求的数据进行protobuf协议处理
};int main()
{Server server(8085);server.start();return 0;
}

客户端:

#include "include/muduo/net/TcpClient.h"
#include "include/muduo/net/EventLoopThread.h"
#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/base/CountDownLatch.h"
#include <iostream>
#include <functional>class TranslateClient
{public:TranslateClient(const std::string&sip,int sport):_latch(1),_client(_loopthread.startLoop(),muduo::net::InetAddress(sip,sport),"Translate"){_client.setConnectionCallback(std::bind(&TranslateClient::onConnection,this,std::placeholders::_1));_client.setMessageCallback(std::bind(&TranslateClient::onMessage,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));}//连接服务器,需要进行阻塞等待连接建立成功之后再进行返回void connect(){_client.connect();//阻塞等待_latch.wait();}bool send(const std::string&msg){if(_conn->connected()){_conn->send(msg);return true;}return false;}private: //连接建立成功时候的回调函数,建立成功的时候,唤醒上面的阻塞void onConnection(const muduo::net::TcpConnectionPtr&conn){if(conn->connected()){_latch.countDown();_conn=conn;}else{//连接操作关闭_conn.reset();}}//收到消息时候的回调函数void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp){std::cout<<"翻译结果为:"<<buf->retrieveAllAsString()<<std::endl;}private:muduo::CountDownLatch _latch;muduo::net::EventLoopThread _loopthread;muduo::net::TcpClient _client;muduo::net::TcpConnectionPtr _conn;
};int main()
{TranslateClient client("127.0.0.1",8085);client.connect();while(1){std::string buf;std::cin>>buf;client.send(buf);}return 0;
}

编译文件如下:

all:client server
client:protobuf_client.cpp request.pb.cc ../include/muduo/proto/codec.ccg++ -std=c++11 $^ -o $@ -I../include -L../lib -lmuduo_net -lmuduo_base -pthread -lprotobuf -lz
server:protobuf_server.cpp request.pb.cc ../include/muduo/proto/codec.ccg++ -std=c++11 $^ -o $@ -I../include -L../lib -lmuduo_net -lmuduo_base -pthread -lprotobuf -lz

文章转载自:

http://yc72iTrI.wnqbf.cn
http://GHSnPtgg.wnqbf.cn
http://K4XTzjF9.wnqbf.cn
http://T8Vm4aCE.wnqbf.cn
http://pRgkMrxh.wnqbf.cn
http://lKZzvsuu.wnqbf.cn
http://BMJ3ZRxm.wnqbf.cn
http://E2e7hfi6.wnqbf.cn
http://b01AidIU.wnqbf.cn
http://bJUQf4Xf.wnqbf.cn
http://aiKyR0pl.wnqbf.cn
http://r7cJFHgg.wnqbf.cn
http://e3gj8Qck.wnqbf.cn
http://X95maIpS.wnqbf.cn
http://ZGP7EPYa.wnqbf.cn
http://rT8HjIDW.wnqbf.cn
http://NQ5NYr9H.wnqbf.cn
http://aeNKTXpR.wnqbf.cn
http://vcJVP9bA.wnqbf.cn
http://iq4aS520.wnqbf.cn
http://AIwAJUla.wnqbf.cn
http://AxRBIEp0.wnqbf.cn
http://a9D3t1vN.wnqbf.cn
http://XleK1ZZ6.wnqbf.cn
http://LpC2hXzI.wnqbf.cn
http://TwNOb1TB.wnqbf.cn
http://3R4YXGbA.wnqbf.cn
http://KPgxwWoT.wnqbf.cn
http://b1vYqWxN.wnqbf.cn
http://1inMXzRg.wnqbf.cn
http://www.dtcms.com/a/371947.html

相关文章:

  • Android开发-图像显示
  • OpenHarmony之设备风险管理平台(SecurityGuard)模块源码详解
  • Kotlin 协程之 Flow 的理解使用及源码解析
  • Vue2.x核心技术与实战(六)-Vuex
  • 认知篇#12:基于非深度学习方法的图像特征提取
  • 软考备考①
  • 信息安全工程师软考攻坚:第三章网络安全技术深度解析与实战训练
  • JDK17日期格式‘MMM’导致九月Sept/Sep格式化异常问题❗❗❗
  • Vulkan 学习(20)---- UniformBuffer 的使用
  • 微信小程序中实现AI对话、生成3D图像并使用xr-frame演示
  • 【不背八股】9.MySQL知识点汇总
  • MySQL6
  • 论文阅读:ICLR 2021 BAG OF TRICKS FOR ADVERSARIAL TRAINING
  • GD32自学笔记:4.ADC
  • LeetCode 522.最长特殊序列2
  • CentOS 7.2 虚机 ssh 登录报错在重启后无法进入系统
  • 腾讯混元 3D 2.0 Windows 便携版:低显存需求下的高效文/图生3D体验
  • 火山 RTC 引擎15 拉流 推流 地址生成器 、合流转推 开关
  • CesiumJS详解:打造专业级Web 3D地球仪与地图的JavaScript库
  • 数据结构:顺序表与链表
  • C++ 前缀和 高频笔试考点 实用技巧 牛客 DP34 [模板] 前缀和 题解 每日一题
  • kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect(三)
  • 【软考架构】第七章 系统架构设计基础知识-7.2基于架构的软件开发方法:Architecture-Based Software Design,ABSD
  • Dify 从入门到精通(第 81/100 篇):Dify 的多模态模型监控(高级篇)
  • 2019年11月系统架构设计师真题及解析摘要
  • 基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT)
  • IO性能篇(二):文件读写的四种分类
  • 超越模仿,探寻智能的本源:从人类认知机制到下一代自然语言处理
  • 计算机视觉(十二):人工智能、机器学习与深度学习
  • 去中心化投票系统开发教程 第五章:测试与部署