cpp-tbox 之 RPC 通信服务

jsonrpc

序列化与反序列化基于的是json

Proto

该类设计用于处理网络或传输层数据接收和发送,同时提供一些回调函数接口来定义如何处理接收到的数据和发送数据,也就是整个RPC的框架类

对于接收请求的回调函数,参数是请求id,方法名method,请求参数params

对于接收响应的回调函数,参数是请求id(用于异步回复),错误码errcode,错误信息result

对于发送数据的回调函数,参数是数据指针和数据大小

包括发送请求,发送响应结果,发送错误,这些过程都是RPC框架的系列。所有的参数都会变成Json,他们最终都会调用sendJson。

接受到数据需要解包和处理

以上是RPC框架提供的相关方法,对于针对性的RPC框架需要实现下面两个函数,即对Json数据发送/Json数据接收。

在RPC基类框架proto中onRecvJson的实现其实就是对Json进行讨论拆分,包括一些健壮性判断,以及拆分成功后作为入参调用对应的回调函数。它的接口是对js进行处理,对于不同协议,我们只需要将传输内容反序列化成合适的Json对象就可以调用统一的onRecvJson接口。

raw_stream_proto

裸流协议TCP

通过对Json特征字符进行拆分来划分数据包,重写onRecvData和sendJson.

send_data_cb_提供一个函数接口给网络传输,做到功能解耦。

FindEndPos是自己封装的Json解析函数,找到Json结束的位置,再使用Json自带的parse对其进行反序列化。该种方式使用于流式协议TCP。最后调用统一接口onRecvJson。

packet_proto

分包协议UDP/MQTT/HTTP

同上

分包协议本身就是按完整的数据包即Json数据进行发送

header_stream_proto

使用序列化对象pack对json_text进行序列化,添加了魔幻数和头部信息

send_data_cb_部分是相同的

使用Deserializer unpack对data_ptr反序列化,将头部信息拆出来,魔幻数用于检验和,后序和上面的proto是一样的。

Rpc

这是一个简单的远程过程调用(RPC)类的声明,用于在网络通信中进行方法调用和通知。它提供了添加服务、发送请求、发送通知以及发送异步回复等功能

method_services_是服务提供方使用的数据结构,hash映射根据函数名能映射到本地对应回调函数,通过addService来增添服务。

request_callback_是请求方使用的数据结构,hash映射根据请求id来调用收到回复的回调函数。

tobe_respond_用于异步回复,键是请求id

Rpc 类中定义了两种回调函数类型:RequestCallback 用于处理收到对端回复的情况,ServiceCallback 用于处理收到对端请求的情况。

构造函数和析构函数用于初始化请求/回复的时间检测。

initialize 方法用于初始化 RPC 实例,设置协议和超时时间。

addService 方法用于添加服务,即指定某个方法被调用时的回调函数。

request 方法用于发送需要对端回复的请求,支持同步和异步方式。底层实际上调用了proto的sendRequest函数。

notify 方法用于发送不需要对端回复的通知。底层实际上调用了proto的sendRequest函数。

respond 方法用于发送异步回复。底层实际上调用了proto的sendResult/sendError函数。

一些私有方法用于处理接收请求、接收回复以及超时情况。

相关推荐
GetcharZp12 分钟前
拒绝硬编码!C++ 配置文件管理神器 yaml-cpp 实战指南
c++
To Be Clean Coder20 分钟前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
老前端的功夫26 分钟前
TypeScript 全局类型声明:declare关键字的深度解析与实战
linux·前端·javascript·ubuntu·typescript·前端框架
赵民勇30 分钟前
join命令使用指南与技巧
linux·shell
墨有66639 分钟前
C++ string 部分功能详解:迭代器、初始化与常用函数
开发语言·c++
想用offer打牌41 分钟前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
枫叶丹41 小时前
【Qt开发】Qt系统(二)-> 事件分发器
c语言·开发语言·数据库·c++·qt·系统架构
工业HMI实战笔记1 小时前
【拯救HMI】让老设备重获新生:HMI低成本升级与功能拓展指南
linux·运维·网络·信息可视化·人机交互·交互·ux
代码游侠1 小时前
复习—sqlite基础
linux·网络·数据库·学习·sqlite
程序员NEO1 小时前
LangChain4j 工具调用实战
后端