专栏首页C++的沉思基于zmq RPC简单C++实现
原创

基于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,本人只是做了优化,非常感谢原作者

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 外观模式-分析和C++实现

    由于上面外观模式的结构过于抽象,因此把它具体点。假设系统内有三个模块,分别是AModule,BModule和CModule,它们分别有一个示意的方法,那么整体结...

    evenleo
  • KMP算法分析

    KMP 算法是一种改进的字符串匹配算法,KMP 算法是由 D.E.Knuth,J.H.Morris 和 V.R.Pratt 三人提出的,因此人们称它为克努特—莫...

    evenleo
  • C++实现epoll echo服务器

    通常来说,实现处理tcp请求,为一个连接一个线程,在高并发的场景,这种多线程模型与Epoll相比就显得相形见绌了。epoll是linux2.6内核的一个新的系统...

    evenleo
  • NATURE NEUROSCIENCE:大脑动态隐性状态是行为导向的工作记忆的基础

    来自牛津大学的学者Michael J Wolff等人在Nature Neuroscience期刊上发文,提出了一种功能扰动的方法来探测大脑的隐性状态,...

    用户1279583
  • C++STL中map的使用策略(一)

    mathor
  • 从socket api看网络通信流程

    说了网络通信,大家肯定都不会陌生,比如各种分布式系统、大数据框架等等都要涉及到网络通信,由于大多数通信都是基于TCP协议来的,因此本文就以TCP为例,结合soc...

    luoxn28
  • Scikit-learn使用总结

    在机器学习和数据挖掘的应用中,scikit-learn是一个功能强大的python包。在数据量不是过大的情况下,可以解决大部分问题。学习使用scikit-lea...

    用户1332428
  • LeetCode 339. 嵌套列表权重和(DFS)

    每个元素要么是整数,要么是列表。同时,列表中元素同样也可以是整数或者是另一个列表。

    Michael阿明
  • LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)

    给你一棵有 n 个节点的无向树,节点编号为 0 到 n-1 ,它们中有一些节点有苹果。 通过树上的一条边,需要花费 1 秒钟。 你从 节点 0 出发,请你返...

    Michael阿明
  • 计算机的原码, 反码, 补码你了解吗?

    一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

    cxuan

扫码关注云+社区

领取腾讯云代金券