轉自http://www.cnblogs.com/wanghaoran/p/3189017.html
SimpleXMLRPCServer模組為XML-RPC服務端的寫入提供了一個基本的架構。利用SimpleXMLRPCServer伺服器既可以一直空閑,也可以利用CGIXMLRPCRequestHandler來嵌入到一個CGI環境中。
XML-RPC(Remote Procedure Call)是通過HTTP傳輸協議,利用XML格式的遠端程式調用方法。用戶端可以調用服務端帶參數的方法並擷取返回的結構資料。(服務端的名字是一個URI)。這個模組支援寫入XML-RPC端的代碼。它用來處理所有轉換的細節在在整合的Python對象和XML報文之間。
Eg1服務端代碼:
from SimpleXMLRPCServer import SimpleXMLRPCServerfrom SimpleXMLRPCServer import SimpleXMLRPCRequestHandlerclass RequestHandler(SimpleXMLRPCRequestHandler): rpc_paths = ('/RPC2')server = SimpleXMLRPCServer(("localhost", 8000),requestHandler = RequestHandler)#server = SimpleXMLRPCServer(("localhost", 8000))server.register_introspection_functions()server.register_function(pow)def adder_function(x,y): return x+yserver.register_function(adder_function,'add')class MyFuncs: def div(self, x, y): return x//yserver.register_instance(MyFuncs())server.serve_forever()
Eg1用戶端代碼:
import xmlrpclibs = xmlrpclib.ServerProxy('http://localhost:8000')print s.pow(2,3)print s.add(2,3)print s.div(5,2)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服務端代碼:
import datetimefrom SimpleXMLRPCServer import SimpleXMLRPCServerimport xmlrpclibdef today(): today = datetime.datetime.today() return xmlrpclib.DateTime(today)def add(x,y): return x+ydef subtract(x,y): return x-ydef multiply(x,y): return x*ydef divide(x,y): return x/yserver = SimpleXMLRPCServer(("localhost", 8001))print "Listening on port 8001..."server.register_multicall_functions()server.register_function(today, "today")server.register_function(add, "add")server.register_function(subtract, "subtract")server.register_function(multiply, "multiply")server.register_function(divide, "divide")server.serve_forever()
注意:
server.register_multicall_functions()##這個函數的作用是可以使用戶端同時調用服務端的的多個函數。
Eg2用戶端代碼:
import xmlrpclibimport datetimeproxy = xmlrpclib.ServerProxy("http://localhost:8001/")print proxy.add(7,3)print proxy.subtract(7,3)print proxy.multiply(7,3)print proxy.divide(7,3)today = proxy.today()multicall = xmlrpclib.MultiCall(proxy)multicall.today()multicall.add(7,3)multicall.subtract(7,3)multicall.multiply(7,3)multicall.divide(7,3)result = multicall()# convert the ISO8601 string to a datetime objectconverted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")print "Today1: %s, 7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)
注意:
multicall = xmlrpclib.MultiCall(proxy)
……
result = multicall()##將這兩個函數之間的傳回值寫入到result中。