Python的xmlrpc库基于XML和HTTP实现轻量级RPC,服务端用xmlrpc.server(原SimpleXMLRPCServer),支持线程安全与introspection;客户端用ServerProxy调用远程方法,需注意路径、方法名及类型限制。
Python 的 xmlrpc 库(标准库中的 xmlrpc.client 和 xmlrpc.server)用于实现轻量级的远程过程调用(RPC),基于 XML 编码和 HTTP 传输。它适合简单服务交互,无需复杂协议或依赖第三方包。
Python 3.3+ 中,SimpleXMLRPCServer 已移入 xmlrpc.server 模块,且支持线程安全(默认单线程,可搭配 ThreadingMixIn 支持并发)。
示例服务端(支持加法、获取时间):
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler import datetime可选:限制只响应特定路径(增强安全性)
class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',)
def add(x, y): return x + y
def get_time(): return datetime.datetime.now().isoformat()
创建服务器,监听本地 8000 端口
server = SimpleXMLRPCServer(('localhost', 8000), requestHandler=RequestHandler) server.register_function(add, 'calc.add') server.register_function(get_time, 'system.time')
可选:注册内置系统方法(如 system.listMethods)
server.register_introspection_functions()
print("XML-RPC server running on https://www./link/464d0b9d99efb7a4595380d03b7ea164") try: server.serve_forever() except KeyboardInterrupt: print("\nShutting down server.")
说明:
register_function(func, name) 将函数暴露为远程可调用方法,name 是客户端调用时用的名称(如 calc.add)register_introspection_functions() 启用 system.listMethods、system.methodHelp 等调试方法ThreadingMixIn:from socketserver import ThreadingMixInclass ThreadedXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass
server = ThreadedXMLRPCServer(('localhost', 8000'))
客户端通过 URL 创建代理对象,像调用本地函数一样调用远程方法。
import xmlrpc.client连接服务端(注意路径 /RPC2 必须和服务端一致)
proxy = xmlrpc.client.ServerProxy('https://www./link/464d0b9d99efb7a4595380d03b7ea164')
调用远程方法(自动序列化/反序列化)
result = proxy.calc.add(10, 20) print("10 + 20 =", result) # 输出:10 + 20 = 30
time_str = proxy.system.time() print("Server time:", time_str)
查看可用方法(需服务端启用了 introspection)
methods = proxy.system.listMethods() print("Available methods:", methods)
关键点:
/RPC2),否则会返回 404proxy.calc.add 对应服务端注册的 'calc.add')xmlrpc.client.Binary 包装XML-RPC 原生不支持 raw bytes,需用 Binary 类封装:
# 服务端增加方法
def upload_data(data_bin):
data = data_bin.data # 获取 bytes
print(f"Received {len(data)} bytes")
return len(data)
server.register_function(upload_data, 'file.upload')
客户端调用
with open('test.bin', 'rb') as f:
binary_data = xmlrpc.client.Binary(f.read())
proxy.fi

le.upload(binary_data)
SimpleXMLRPCServer 别名,必须从 xmlrpc.server 导入xmlrpc.client.Fault 或 ConnectionError,建议 try/except 包裹调用不复杂但容易忽略:确保服务端和客户端使用相同路径、方法名大小写一致、参数类型在 XML-RPC 支持范围内。调试时先用 system.listMethods 确认接口可达。