Python中關於XML-RPC原理__Python

來源:互聯網
上載者:User

轉自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中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.