基于zmq RPC简单C++实现
时间:2022-07-25
本文章向大家介绍基于zmq RPC简单C++实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
simple-rpc
依赖
zmq
编译
mkdir build
cd build
cmake ..
make
基本类型的序列化和反序列化
#include "serializer.h"
#include <iostream>
//自定义类型需要重载操作符>>和<<
struct foo {
int n;
std::string str;
foo() {}
foo(int a, std::string s)
: n(a), str(s) {}
friend Serializer& operator>>(Serializer& in, foo& f)
{
in >> f.n >> f.str;
return in;
}
friend Serializer& operator<<(Serializer& out, foo& f)
{
out << f.n << f.str;
return out;
}
};
// 测试原生类型的序列化和反序列化
void test1()
{
int a = 100;
std::string c = "hello";
Serializer sr;
sr << a; //序列化
sr << c;
int b = 0;
std::string d;
sr >> b; //反序列化
sr >> d;
std::cout << "b=" << b << ", d=" << d << std::endl;
}
//测试自定义类型的序列化和反序列化
void test2()
{
foo a(23, "evenleo");
Serializer sr;
sr << a;
foo b;
sr >> b;
std::cout << "b.n=" << b.n << ", b.str=" << b.str << std::endl;
}
int main(int argc, char** argv)
{
test1();
test2();
return 0;
}
输出结果:
b=100, d=hello
b.n=23, b.str=evenleo
RPC
rpc_server
#include <string>
#include <iostream>
#include "rpc.h"
// 类成员函数
struct foo {
int add(int a, int b) { return a + b; }
};
// 普通函数
std::string Strcat(std::string s1, int n)
{
return s1 + std::to_string(n);
}
int main()
{
rpc server;
server.as_server(5555);
foo f;
server.regist("add", &foo::add, &f); //注册类成员函数
server.regist("Strcat", Strcat); //注册普通函数
server.run();
return 0;
}
rpc_client
#include <string>
#include <iostream>
#include "rpc.h"
int main()
{
rpc client;
client.as_client("127.0.0.1", 5555);
std::string str = client.call<std::string>("Strcat", "even", 24).value();
std::cout << "str=" << str << std::endl;
int result = client.call<int>("add", 3, 4).value();
std::cout << "result=" << result << std::endl;
return 0;
}
需要启动rpc_server,然后启动rpc_client,请求Strcat和add返回结果:
str=even24
result=7
本项目源自GitHub的项目button-chen/buttonrpc_cpp14,本人只是做了优化,非常感谢原作者
- Java 枚举类型enum 的使用
- linux下操作 mysql的基本命令
- CentOs7.3 搭建 RabbitMQ 3.6 单机服务
- Redis实现信息已读未读状态提示
- HashMap源码理解
- JSP Layout详细介绍
- J2Cache——Java两级缓存框架
- SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)
- 不到百行代码实现,类似iPhone的滑块开关
- 《深入理解Java虚拟机》(一)Java虚拟机发展史
- Servlet是如何实现MVC的?
- 基础篇章:关于 React Native 的props,state,style的讲解
- 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略
- 一个类似于进度和打卡进度的自定义view
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法