前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于zmq RPC简单C++实现

基于zmq RPC简单C++实现

原创
作者头像
evenleo
修改2020-09-17 10:27:34
3K0
修改2020-09-17 10:27:34
举报
文章被收录于专栏:C++的沉思

simple-rpc

依赖

zmq

编译

代码语言:txt
复制
mkdir build
cd build
cmake ..
make

基本类型的序列化和反序列化

代码语言:txt
复制
#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;
}

输出结果:

代码语言:txt
复制
b=100, d=hello
b.n=23, b.str=evenleo

RPC

rpc_server

代码语言:txt
复制
#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

代码语言:txt
复制
#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返回结果:

代码语言:txt
复制
str=even24
result=7

本项目源自GitHub的项目button-chen/buttonrpc_cpp14,本人只是做了优化,非常感谢原作者

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • simple-rpc
    • 依赖
      • 编译
        • 基本类型的序列化和反序列化
          • RPC
          相关产品与服务
          文件存储
          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档