1 服务器
在 Python 中,xmlrpc
模块是一个集合了 XML-RPC 服务端与客户端实现模块的包。 这些模块是:
我们使用 SimpleXMLRPCServer
来创建 SimpleXMLRPCSERVER
实例,并告诉它以侦听传入请求。接下来,我们将某些功能定义为服务的一部分并注册这些功能,以便服务器知道如何调用它。
创建一个 xmlrpc_server.py
文件。下面的示例中,我们使用 SimpleXMLRPCServer 实例创建服务器,并注册一些预定义和自定义功能。最后,我们将服务器放入无限的循环接收和响应请求中。
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',) with SimpleXMLRPCServer(('localhost', 9000), requestHandler=RequestHandler) as server: server.register_introspection_functions() # Register len() function; server.register_function(len) # Register a function under a different name @server.register_function(name='rmndr') def remainder_function(x, y): return x // y # Register a function under function.__name__. @server.register_function def modl(x, y): return x % y server.serve_forever()
XML-RPC 可以让我们很容易的构造一个简单的远程调用服务。你所需要做的仅仅是创建一个服务器实例, 通过它的方法 register_function()
来注册函数,然后使用方法 serve_forever()
启动它。
一旦启动了上述服务器,就可以通过客户端程序来调用,该程序可以参考函数并进行函数调用。
2 运行客户端
创建一个 xmlrpc_client.py
文件:
import xmlrpc.client s = xmlrpc.client.ServerProxy('http://localhost:9000') print(s.len("Yuzhou1su")) print(s.rmndr(1024,128)) print(s.modl(7,3)) # Print list of available methods print(s.system.listMethods())
在终端中能看到如下输出
$ python xmlrpc_client.py 9 8 1 ['len', 'modl', 'rmndr', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
- 第一个结果:字符串 Yuzhou1su 长度为 9
- 第二个结果:1024 除以 128 的整除结果为 8
- 第三个结果:7 除以 3 的余数为 1
- 最后一行:输出系统方法
总结
XML-RPC 的缺点:
- 它的性能不高
- 不支持其他数据格式的传输。以及 XML-RPC 会将所有的数据序列化为 XML 格式,因此就会比其他的方法要慢一些
- 而且其不能安全防范恶意构建的数据。
XML-RPC 的优点:
- 传输复杂的数据。
- 通过程序语言的封装,实现远程对象的调用。
但是,这种简单的编码的优势在于许多其他的编程语言都能够理解。使用
XML-RPC 的话,客户端程序就可以采用 Python 之外的语言来编写,同样可以访问你
的服务。
抛开 XML-RPC 的局限性不说,如果需要以快速但并不完善(quick and dirty)的方式
实现一个远端过程调用系统,那么了解一下 XML-RPC 还是很值得的。很多时候简单
的方案就已经足够好了。另外,JSON-RPC 的原理与其类似。