xmlrpc.client 和 xmlrpc.server 是 Python 標準庫中用于構建基于 XML-RPC 協議的遠程過程調用(RPC)通信模塊。
xmlrpc.client 用于編寫客戶端程序,向遠程服務器發起方法調用。
xmlrpc.server 用于編寫服務器端,暴露本地方法供遠程客戶端調用。
XML-RPC 是一種基于 HTTP 和 XML 的遠程調用協議,兼具跨語言、結構清晰、實現簡單的特點,廣泛用于輕量級 RPC 服務。
常見應用場景:
(1)構建跨語言遠程調用接口(如 Python 調用 Java、PHP 服務)。
(2)快速構建基于 HTTP 的內部遠程控制服務。
(3)教學實驗場景下的 RPC 模擬。
(4)內網服務通信或嵌入式設備控制。
◆??◆??◆
核心概念
1、XML-RPC 協議
通過 HTTP 傳輸 XML 格式的遠程方法調用請求和響應結果。
2、服務端注冊函數
通過 register_function() 將本地函數暴露給遠程訪問。
3、客戶端代理對象
通過 ServerProxy 實例自動將方法調用轉為 XML-RPC 請求。
4、請求傳參限制
僅支持基礎數據類型(字符串、整數、浮點、布爾、列表、字典等)。
5、傳輸層協議
基于 HTTP,默認端口為 8000,可自由修改。
◆??◆??◆
應用舉例
例 1:簡單的 XML-RPC 服務端
# server.pyfrom?xmlrpc.server?import?SimpleXMLRPCServer
def?add(x, y):? ??return?x + y
server = SimpleXMLRPCServer(("localhost",?8000))server.register_function(add,?"add")print("XML-RPC Server is running on http://localhost:8000")server.serve_forever()
例 2:對應的客戶端調用
# client.pyfrom?xmlrpc.client?import?ServerProxy
proxy = ServerProxy("http://localhost:8000/")result = proxy.add(5,?7)print("Result from server:", result)
例 3:注冊多個函數
from?xmlrpc.server?import?SimpleXMLRPCServer
server = SimpleXMLRPCServer(("localhost",?8000))
def?subtract(x, y):?return?x - ydef?multiply(x, y):?return?x * y
server.register_function(subtract,?"subtract")server.register_function(multiply,?"multiply")
例 4:注冊實例對象(將方法作為服務暴露)
from?xmlrpc.server?import?SimpleXMLRPCServer
server = SimpleXMLRPCServer(("localhost",?8000))
class?Math:? ??def?divide(self, x, y):? ? ? ??return?x / y
server.register_instance(Math()) ?# 自動注冊對象中所有公有方法
例 5:處理客戶端異常
from?xmlrpc.client?import?ServerProxy, Fault
proxy = ServerProxy("http://localhost:8000/")try:? ??print(proxy.divide(4,?0))except?Fault?as?e:? ??print("RPC Fault:", e.faultString)
◆??◆??◆
常用函數速覽
ServerProxy(url, ...)
創建遠程服務代理對象。
參數:
url:服務器地址(如 "http://localhost:8000/")
allow_none:是否允許傳遞 None(默認 False)
use_datetime:是否將時間類型轉換為 datetime 對象
返回:可調用遠程方法的對象
SimpleXMLRPCServer(address)
創建一個簡單的 XML-RPC 服務器。
參數:
address:一個元組 ("主機", 端口),如 ("localhost", 8000)
返回:XML-RPC 服務實例
register_function(func,?name=None)
將函數注冊為遠程可調用方法。
參數:
func:本地函數對象
name:可選,方法名,默認使用函數名
返回:無
register_instance(obj)
將對象的方法全部注冊為遠程可調用方法。
參數:對象實例
返回:無
serve_forever()
啟動服務器并監聽客戶端請求。
參數:無
返回:無
Fault
異常類。遠程服務器出錯時客戶端拋出的異常。
屬性:
faultCode:錯誤代碼
faultString:錯誤說明
◆??◆??◆
補充說明
1、XML-RPC 僅支持基礎數據類型,不能傳遞自定義對象或文件(推薦使用 base64 編碼后傳遞)。
2、由于基于明文的 HTTP 協議傳輸,不具備加密機制,不建議在公網環境中暴露。
3、若需并發支持,請使用 ThreadingXMLRPCServer 替代 SimpleXMLRPCServer。
4、與 JSON-RPC 相比,XML-RPC 在語法上更冗長,但兼容性更強。
“點贊有美意,贊賞是鼓勵”