
在 Python RPC | 连载 01 - RPC 中我们已经搭建了一个简单的 RPC 的服务端和客户端,使用 SimpleXMLRPCServer 类的 register_instance 函数在服务端注册一个实例,该实例中包含了一个几个方法,所以我们就可以在客户端调用服务端注册的实例的方法。
除了 register_instance 函数之外,还有:
使用 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 对象提供一些默认的方法:
更多方法可以参考 https://docs.python.org/zh-tw/3.10/library/xmlrpc.client.html