SimpleXMLRPCServer模块为XML-RPC服务端的写入提供了一个基本的框架。利用SimpleXMLRPCServer服务器既可以一直空闲,也可以利用CGIXMLRPCRequestHandler来嵌入到一个CGI环境中。
XML-RPC(Remote Procedure Call)是通过HTTP传输协议,利用XML格式的远端程序调用方法。客户端可以调用服务端带参数的方法并获取返回的结构数据。(服务端的名字是一个URI)。这个模块支持写入XML-RPC端的代码。它用来处理所有转换的细节在在整合的Python对象和XML报文之间。
Eg1服务端代码:
1 from SimpleXMLRPCServer import SimpleXMLRPCServer 2 from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler 3 4 class RequestHandler(SimpleXMLRPCRequestHandler): 5 rpc_paths = ('/RPC2') 6 7 server = SimpleXMLRPCServer(("localhost", 8000),requestHandler = RequestHandler) 8 #server = SimpleXMLRPCServer(("localhost", 8000)) 9 server.register_introspection_functions() 10 11 server.register_function(pow) 12 13 def adder_function(x,y): 14 return x+y 15 server.register_function(adder_function,'add') 16 17 class MyFuncs: 18 def div(self, x, y): 19 return x//y 20 server.register_instance(MyFuncs()) 21 server.serve_forever()
Eg1客户端代码:
1 import xmlrpclib 2 3 s = xmlrpclib.ServerProxy('http://localhost:8000') 4 print s.pow(2,3) 5 print s.add(2,3) 6 print s.div(5,2) 7 8 print s.system.listMethods()
XML_RPC服务端创建步骤:
1、 导入SimpleXMLRPCServer模块
2、 实例化一个XML-RPC服务对象,在指定的端口监听请求
server = SimpleXMLRPCServer(("localhost", 8000))
3、 对函数的定义并把该函数注册到server端
server.register_function(adder_function,'add')##adder_function是服务点定义的函数,add是客户端调用时用的函数。
server.register_introspection_functions()##如果用到内部函数,需要把内部函数注册到服务端。
server.register_instance(MyFuncs())##如果要注册的是一个类,可以利用这个函数把类中的方法全部注册到server端。
4、服务端开始监听运行server.serve_forever()
XML_RPC客户端创建步骤:
1、 导入xmlrpclib库模块
2、 创建一个代理到服务端
proxy = xmlrpclib.ServerProxy('http://localhost:8000')##函数参数是URL格式
3、通过代理就可以调用服务端的方法。
Eg2服务端代码:
1 import datetime 2 from SimpleXMLRPCServer import SimpleXMLRPCServer 3 import xmlrpclib 4 5 def today(): 6 today = datetime.datetime.today() 7 return xmlrpclib.DateTime(today) 8 def add(x,y): 9 return x+y 10 def subtract(x,y): 11 return x-y 12 def multiply(x,y): 13 return x*y 14 def divide(x,y): 15 return x/y 16 17 server = SimpleXMLRPCServer(("localhost", 8001)) 18 print "Listening on port 8001..." 19 server.register_multicall_functions() 20 server.register_function(today, "today") 21 server.register_function(add, "add") 22 server.register_function(subtract, "subtract") 23 server.register_function(multiply, "multiply") 24 server.register_function(divide, "divide") 25 server.serve_forever()
注意:
server.register_multicall_functions()##这个函数的作用是可以使客户端同时调用服务端的的多个函数。
Eg2客户端代码:
1 import xmlrpclib 2 import datetime 3 4 proxy = xmlrpclib.ServerProxy("http://localhost:8001/") 5 6 print proxy.add(7,3) 7 print proxy.subtract(7,3) 8 print proxy.multiply(7,3) 9 print proxy.divide(7,3) 10 today = proxy.today() 11 multicall = xmlrpclib.MultiCall(proxy) 12 multicall.today() 13 multicall.add(7,3) 14 multicall.subtract(7,3) 15 multicall.multiply(7,3) 16 multicall.divide(7,3) 17 result = multicall() 18 19 # convert the ISO8601 string to a datetime object 20 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S") 21 print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M") 22 print "Today1: %s, 7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)
注意:
multicall = xmlrpclib.MultiCall(proxy)
……
result = multicall()##将这两个函数之间的返回值写入到result中。