C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 开源项目

    • libco

      • libco - 协程学习
    • ButtonRPC

      • ButtonRPC - rpc基础
      • ButtonRPC - 框架解析
      • ButtonRPC - 编程实现
    • Tars

      • Tars - 简介
      • Tars - 框架学习
      • Tars - Cpp开发
      • Tars - Go开发
      • Tars - Docker部署
      • Tars - Gateway部署
  • 学习项目

    • hmdp(Redis实战项目)

      • hmdp - 概览
      • hmdp - 短信登录
      • hmdp - 商户查询缓存
      • hmdp - 秒杀优化
      • hmdp - 分布式锁
      • hmdp - Redission
      • hmdp - Redis消息队列
      • hmdp - 优惠卷秒杀
      • hmdp - 附近商户
      • hmdp - UV统计
      • hmdp - 用户签到
      • hmdp - 好友关注
      • hmdp - 达人探店
    • SSM(Spring+SpringMVC+MyBatis)

      • SSM - Spring框架学习
      • SSM - IOC/DI配置管理第三方bean
      • SSM - Spring整合
      • SSM - SpringAOP
      • SSM - SpringMVC 基础
      • SSM - SpringMVC 应用
      • SSM - Maven高级
      • SSM - SpringBoot
      • SSM - MyBatisPlus
  • 个人项目

    • person - 概述
  • 项目开发

    • 项目开发 - C++开源项目推荐
    • 项目开发 - 整体开发流程
    • 项目开发 - 优化项目内容
    • 项目开发 - 注意事项
    • 项目开发 - 统一建模语言UML类图
  • Idea

    • Idea - 思维框架图
    • Idea - 常用技术检索
    • Idea - 小技巧tips
    • Idea - 编程中的tips

buttonrpc - 编程实现

  • 客户端
  • 服务端

客户端

#include <string>
#include <iostream>
#include <ctime>
#include "buttonrpc.hpp"
#include <stdio.h>

class Student
{
public:
	std::string toString(std::string name, int age, std::string address)
	{
		std::cout << "call Student::toString" << std::endl;
		return "name:" + name + " age:" + std::to_string(age) + " address:" + address;
	}
};

struct PersonInfo
{
	int age;
	std::string name;
	float height;

	// must implement
	friend Serializer &operator>>(Serializer &in, PersonInfo &d)
	{
		in >> d.age >> d.name >> d.height;
		return in;
	}
	friend Serializer &operator<<(Serializer &out, PersonInfo d)
	{
		out << d.age << d.name << d.height;
		return out;
	}
};

int main()
{
	buttonrpc client;
	client.as_client("127.0.0.1", 5555);
	client.set_timeout(2000);

	client.call<void>("testFun");

	client.call<void>("testInputValue", 20);

	int addResult = client.call<int>("testAdd", 10, 20).val();
	std::cout << "addResult: " << addResult << std::endl;

	Student stu;

	std::string retString = client.call<std::string>("toString", "Jason", 24, "NJ").val();

	std::cout << "retString: " << retString << std::endl;

	PersonInfo person = {10, "buttonrpc", 170};
	person = client.call<PersonInfo>("personFun", person, 10).val();

	std::cout << "person age: " << person.age << std::endl;
	std::cout << "person name: " << person.name << std::endl;
	std::cout << "person height: " << person.height << std::endl;

	value_t<void> testValue_t = client.call<void>("foo_7", 111, 222, 333);
	std::cout << "testValue_t val: " << testValue_t.val() << std::endl;
	std::cout << "testValue_t code: " << testValue_t.error_code() << std::endl;
	std::cout << "testValue_t msg: " << testValue_t.error_msg() << std::endl;

	return 0;
}

服务端

#include <string>
#include <iostream>
#include "buttonrpc.hpp"

// 测试例子
void testFun()
{
	std::cout << "call testFun" << std::endl;
}

void testInputValue(int arg)
{
	std::cout << "call testInputValue" << std::endl;
}

int testAdd(int a, int b)
{
	std::cout << "call testAdd " << std::endl;
	return a + b;
}

class Student
{
public:
	std::string toString(std::string name, int age, std::string address)
	{
		std::cout << "call Student::toString" << std::endl;
		return "name:" + name + " age:" + std::to_string(age) + " address:" + address;
	}
};

struct PersonInfo
{
	int age;
	std::string name;
	float height;

	// must implement
	friend Serializer &operator>>(Serializer &in, PersonInfo &d)
	{
		in >> d.age >> d.name >> d.height;
		return in;
	}
	friend Serializer &operator<<(Serializer &out, PersonInfo d)
	{
		out << d.age << d.name << d.height;
		return out;
	}
};

PersonInfo personFun(PersonInfo d, int hight)
{
	std::cout << "call personFun" << std::endl;
	PersonInfo ret;
	ret.age = d.age + 10;
	ret.name = d.name + " is good";
	ret.height = d.height + hight;
	return ret;
}

int main()
{
	buttonrpc server;
	server.as_server(5555);

	server.bind("testFun", testFun);
	server.bind("testInputValue", testInputValue);
	server.bind("testAdd", std::function<int(int, int)>(testAdd));

	Student stu;
	server.bind("toString", &Student::toString, &stu);

	server.bind("personFun", personFun);

	std::cout << "run rpc server on: " << 5555 << std::endl;
	server.run();

	return 0;
}

Last Updated:
Contributors: klc407073648
Prev
ButtonRPC - 框架解析