文章目錄
- 🌐 一、什么是 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 字段)
- 加入 方法權限控制(如認證)
- 支持異步調用或多線程并發