Python的xmlrpc是标准库内置的远程过程调用实现方案,基于XML格式传输数据,支持在不同进程甚至不同机器上的Python程序之间直接调用对方的方法,不需要手动处理网络传输和数据序列化逻辑,使用门槛很低。

xmlrpc核心工作原理
xmlrpc的通信流程主要分为三步:首先服务器端注册可供远程调用的方法并启动服务监听指定端口,然后客户端连接到服务器端口,最后客户端调用远程方法时,请求会被封装成XML格式发送到服务器,服务器执行对应方法后将结果再封装成XML返回给客户端。
整个过程对开发者透明,调用远程方法和使用本地方法语法几乎一致,只需要关注方法本身的实现逻辑即可。
xmlrpc服务器端实现
服务器端需要使用xmlrpc.server模块中的SimpleXMLRPCServer类,首先定义需要暴露给客户端调用的方法,然后将方法注册到服务器实例中,最后启动服务监听。
基础服务器示例
下面是一个简单的服务器端实现,提供了加法和获取系统时间两个可远程调用的方法:
from xmlrpc.server import SimpleXMLRPCServer
import time
# 定义要暴露的远程方法
def add(a, b):
"""两个数相加的远程方法"""
return a + b
def get_current_time():
"""获取当前时间戳的远程方法"""
return time.time()
# 创建服务器实例,绑定本地8000端口
server = SimpleXMLRPCServer(("127.0.0.1", 8000))
# 注册远程方法,第一个参数是客户端调用的方法名,第二个是本地对应的函数
server.register_function(add, "add")
server.register_function(get_current_time, "get_current_time")
print("xmlrpc服务器已启动,监听127.0.0.1:8000")
# 启动服务,持续监听客户端请求
server.serve_forever()
服务器实现注意事项
- 注册方法时如果不指定第一个参数,默认使用函数本身的名称作为远程调用名
- 如果需要注册一个类的实例方法作为远程方法,可以使用
server.register_instance(实例对象)的方式,类中所有不带下划线开头的方法都会被暴露 - 默认情况下服务器是单线程处理请求,如果需要支持并发,可以继承
SimpleXMLRPCServer并重写相关方法,或者使用多线程模型
xmlrpc客户端实现
客户端使用xmlrpc.client模块中的ServerProxy类,创建实例时传入服务器地址,之后就可以直接通过实例调用服务器端注册的远程方法。
基础客户端示例
对应上面服务器端的客户端实现代码如下:
from xmlrpc.client import ServerProxy
# 创建客户端代理,连接到服务器地址
client = ServerProxy("http://127.0.0.1:8000")
# 调用远程的add方法
result1 = client.add(3, 5)
print(f"远程调用add(3,5)的结果:{result1}")
# 调用远程的get_current_time方法
result2 = client.get_current_time()
print(f"远程调用get_current_time的结果:{result2}")
客户端调用说明
客户端调用远程方法的参数和返回值会自动进行序列化转换,支持Python的基础数据类型,包括整数、浮点数、字符串、列表、字典、元组等,复杂对象需要提前做序列化处理才能传输。
常见问题与解决方法
连接失败问题
如果客户端提示连接拒绝,首先检查服务器是否已经启动,其次确认服务器绑定的地址和端口与客户端连接的地址端口是否一致,还要注意防火墙是否拦截了对应端口的访问。
方法调用报错
如果调用远程方法时提示方法不存在,检查服务器端是否正确注册了该方法,以及客户端调用的方法名是否和注册的名称完全一致,xmlrpc的方法名是大小写敏感的。
数据传输限制
默认情况下xmlrpc对传输的数据大小有一定限制,如果需要传输大文件或者大量数据,可以调整服务器的requestHandler相关配置,或者拆分数据分多次传输。
适用场景说明
xmlrpc适合用于内部系统之间的简单通信场景,比如不同服务模块之间的方法调用、本地脚本调用远程服务的方法等。如果需要更高性能、更复杂的通信能力,可以考虑使用gRPC、Thrift等更专业的RPC框架。