xmlrpc
允许软件在不同系统运行。实现计算和存储资源的共享。
http://xmlrpc.com/
It's a spec and a set of implementations that allow software running on disparate operating systems, running in different environments to make procedure calls over the Internet.
It's remote procedure calling using HTTP as the transport and XML as the encoding. XML-RPC is designed to be as simple as possible, while allowing complex data structures to be transmitted, processed and returned.
xmlrpc
of python
https://docs.python.org/3.7/library/xmlrpc.html
XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a transport. With it, a client can call methods with parameters on a remote server (the server is named by a URI) and get back structured data.
xmlrpc
is a package that collects server and client modules implementing XML-RPC. The modules are:
xmlrpc.server
https://docs.python.org/3.7/library/xmlrpc.server.html#module-xmlrpc.server
The
xmlrpc.server
module provides a basic server framework for XML-RPC servers written in Python. Servers can either be free standing, usingSimpleXMLRPCServer
, or embedded in a CGI environment, usingCGIXMLRPCRequestHandler
.
xmlrpc.client
https://docs.python.org/3.7/library/xmlrpc.client.html#module-xmlrpc.client
XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP(S) as a transport. With it, a client can call methods with parameters on a remote server (the server is named by a URI) and get back structured data. This module supports writing XML-RPC client code; it handles all the details of translating between conformable Python objects and XML on the wire.
DEMO
https://docs.python.org/3.7/library/xmlrpc.server.html#simplexmlrpcserver-example
SERVER
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCRequestHandler # Restrict to a particular path. class RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2',) # Create server with SimpleXMLRPCServer(('localhost', 8000), requestHandler=RequestHandler) as server: server.register_introspection_functions() # Register pow() function; this will use the value of # pow.__name__ as the name, which is just 'pow'. server.register_function(pow) # Register a function under a different name def adder_function(x, y): return x + y server.register_function(adder_function, 'add') # Register an instance; all the methods of the instance are # published as XML-RPC methods (in this case, just 'mul'). class MyFuncs: def mul(self, x, y): return x * y server.register_instance(MyFuncs()) # Run the server's main loop server.serve_forever()
CLIENT
import xmlrpc.client s = xmlrpc.client.ServerProxy('http://localhost:8000') print(s.pow(2,3)) # Returns 2**3 = 8 print(s.add(2,3)) # Returns 5 print(s.mul(5,2)) # Returns 5*2 = 10 # Print list of available methods print(s.system.listMethods())
MultiCall
考虑到多次调用耗费很大,将多次调用封装成单次调用,以节省资源开销。
The
MultiCall
object provides a way to encapsulate multiple calls to a remote server into a single request 1.
https://docs.python.org/3.7/library/xmlrpc.client.html#module-xmlrpc.client
SERVER
from xmlrpc.server import SimpleXMLRPCServer def add(x, y): return x + y def subtract(x, y): return x - y def multiply(x, y): return x * y def divide(x, y): return x // y # A simple server with simple arithmetic functions server = SimpleXMLRPCServer(("localhost", 8000)) print("Listening on port 8000...") server.register_multicall_functions() server.register_function(add, 'add') server.register_function(subtract, 'subtract') server.register_function(multiply, 'multiply') server.register_function(divide, 'divide') server.serve_forever()
CLIENT
import xmlrpc.client proxy = xmlrpc.client.ServerProxy("http://localhost:8000/") multicall = xmlrpc.client.MultiCall(proxy) multicall.add(7, 3) multicall.subtract(7, 3) multicall.multiply(7, 3) multicall.divide(7, 3) result = multicall() print("7+3=%d, 7-3=%d, 7*3=%d, 7//3=%d" % tuple(result))