文章目录
- ???? 一、什么是 JSON-RPC?
- ???? 二、通信过程
- 1️⃣ 客户端发起请求
- 2️⃣ 服务端处理请求,调用方法,返回结果
- ???? 三、重要字段说明
- ????️ 四、核心函数与概念(结合你的代码)
- ???? 客户端发送请求函数(如 `rpc_add`)
- ???? 服务端处理请求函数(如 `add()`)
- ???? 五、通信流程详解
- ???? 六、常见 JSON-RPC 用法场景
- ???? 七、常用 JSON-RPC C语言库
- ???? 八、扩展建议
我们来系统讲解一下 JSON-RPC 协议,包括它的 核心概念、通信过程、重要字段、常用函数/库,并结合你给的示例代码来加深理解。
???? 一、什么是 JSON-RPC?
JSON-RPC(JSON Remote Procedure Call) 是一种基于 JSON 的远程过程调用协议,它允许你通过网络调用远程系统中的函数/方法。
它具有以下特点:
- 轻量级:只使用 JSON,无需 XML 或复杂的结构。
- 与平台无关:任何支持 JSON 的语言都可实现。
- 双向通信:既可请求调用,也可异步响应。
???? 二、通信过程
JSON-RPC 基于客户端-服务器模式,主要包含以下步骤:
1️⃣ 客户端发起请求
{
"jsonrpc": "2.0",
"method": "add",
"params": [1, 2],
"id": 1
}
2️⃣ 服务端处理请求,调用方法,返回结果
{
"jsonrpc": "2.0",
"result": 3,
"id": 1
}
或者若出错,返回:
{
"jsonrpc": "2.0",
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 1
}
???? 三、重要字段说明
字段 | 类型 | 说明 |
---|---|---|
jsonrpc |
string | 固定值 "2.0"
|
method |
string | 要调用的远程函数名称 |
params |
array/object | 传入参数 |
id |
string/int | 客户端提供的 ID,服务端用于关联响应 |
result |
任意类型 | 成功调用返回值(响应中) |
error |
object | 调用失败时的错误信息(响应中) |
????️ 四、核心函数与概念(结合你的代码)
???? 客户端发送请求函数(如 rpc_add
)
-
构造 JSON 字符串:用
sprintf()
写入 JSON-RPC 格式 - 通过 TCP socket 发送数据
- 接收响应后,用
cJSON_Parse()
解析 JSON
sprintf(buf, "{\"method\": \"add\", \"params\": [%d,%d], \"id\": \"2\" }", a, b);
send(socket, buf, ...);
read(socket, buf, ...);
cJSON *root = cJSON_Parse(buf);
cJSON *result = cJSON_GetObjectItem(root, "result");
???? 服务端处理请求函数(如 add()
)
- 使用 JSON-RPC 库
jrpc_server_init()
初始化服务 - 使用
jrpc_register_procedure()
注册函数名和回调 - 回调函数内部通过
cJSON
提取参数,构造响应 JSON
cJSON *a = cJSON_GetArrayItem(params, 0);
cJSON *b = cJSON_GetArrayItem(params, 1);
return cJSON_CreateNumber(a->valueint + b->valueint);
???? 五、通信流程详解
假设客户端要调用远程函数 add(2, 3)
:
Client Server
│ │
│--- JSON 请求(add) -------------->│
│ {"method": "add", │
│ "params": [2,3], "id": 1} │
│ │
│ 查找方法 add
│ 调用函数 add(2,3)
│ 构造 JSON 返回值
│<-- JSON 响应 --------------------│
│ {"result": 5, "id": 1} │
│ │
│ 解析 JSON → 输出结果 │
???? 六、常见 JSON-RPC 用法场景
场景 | 示例 |
---|---|
嵌入式设备远程控制 | 通过 RPC 控制 LED、读取传感器 |
前后端通信 | 浏览器与后端服务使用 JSON-RPC over WebSocket |
自动化测试平台 | 使用 JSON-RPC 调用接口模拟用户行为 |
区块链(如以太坊) | Ethereum 节点之间通信使用 JSON-RPC API |
???? 七、常用 JSON-RPC C语言库
库名 | 说明 |
---|---|
jsonrpc-c | 你使用的轻量 JSON-RPC C 实现 |
cJSON | 轻量级 JSON 解析/生成库 |
jansson | 更完整的 JSON C 解析库 |
???? 八、扩展建议
- 加入 JSON-RPC 的 通知模式(即没有
id
) - 增加 错误处理机制(返回 error 字段)
- 加入 方法权限控制(如认证)
- 支持异步调用或多线程并发