一、SimpleXMLRPCServer
在 Python RPC | 连载 01 - RPC 中我们已经搭建了一个简单的 RPC 的服务端和客户端,使用 SimpleXMLRPCServer
类的 register_instance
函数在服务端注册一个实例,该实例中包含了一个几个方法,所以我们就可以在客户端调用服务端注册的实例的方法。
除了 register_instance
函数之外,还有:
- register_function(function[,name]):注册一个方法或者服务
- register_introspection_functions():注册一个反函数
- register_multical_functions():注册一个复合函数
使用 register_function 在服务端注册一个提供服务的函数
# filename sever_alpha.py from xmlrpc.server import SimpleXMLRPCServer def respone_str(): return "使用 register_function 注册的服务" server = SimpleXMLRPCServer(("localhost", 8000)) server.register_function(respone_str) server.serve_forever() 复制代码
在客户端调用这个函数
# filename client_alpha.py from xmlrpc import client server = client.ServerProxy("http://0.0.0.0:8000") print(server.respone_str()) 复制代码
启动服务端并运行客户端的调用,输出结果如下:
使用 register_function 注册的服务 复制代码
说明使用 register_function 函数注册的函数可以提供服务。
在服务端注册服务。
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler # 使用 register_introspection_functions 注册 反函数 class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',) server = SimpleXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler) print("Listen on 8000") server.register_introspection_functions() # 注册 pow,幂运算,实际调用的是已有的算数pow() server.register_function(pow) # 注册自定义的 add 函数 def add(x, y): return x + y server.register_function(add, 'add') # 注册 fun 实例 class Fun: def div(self, x, y): return x // y fun = Fun() server.register_instance(fun) server.serve_forever() 复制代码
客户端代码,分别调用服务端注册的几个服务。
from xmlrpc import client s = client.ServerProxy('http://localhost:8000') print(s.pow(3,5)) print(s.add(3,9)) print(s.div(7,3)) print(s.system.listMethods()) 复制代码
启动服务端并运行客户端代码,输出结果如下:
243 12 2 ['add', 'div', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodSignature'] 复制代码
二、ServerProxy
在客户端代码中通过 ServerProxy 的实例化对象来调用远程服务的函数。
ServerProxy 的初始化函数中包含了如下几个参数:
- uri,即服务端的 url 地址
- transport 传输实例,可选,https urls/http
- encoding 编码格式
- verbose 是 debug 模式
- allow_none 是否请求空,若为 True,那么常量 none 将被翻译成 xml,默认如果是 none 则抛出异常 TypeError
- use_datetime 可以使用 date/time, values 记录调用时间 datetime.datetime,默认是 false
ServerProxy 对象提供一些默认的方法:
- ServerProxy.system.listMethods():返回远端服务器方法列表
- ServerProxy.system.methodSignature(name):方法签名,是一个数组类型
- ServerProxy.system.methodHelp(name):方法帮助信息