Python中關於XML-RPC原理

  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客戶端代碼:ide

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服務端建立步驟:
一、 導入SimpleXMLRPCServer模塊
二、 實例化一個XML-RPC服務對象,在指定的端口監聽請求
server = SimpleXMLRPCServer(("localhost", 8000))
三、 對函數的定義並把該函數註冊到server端
server.register_function(adder_function,'add')##adder_function是服務點定義的函數,add是客戶端調用時用的函數。
server.register_introspection_functions()##若是用到內部函數,須要把內部函數註冊到服務端。
server.register_instance(MyFuncs())##若是要註冊的是一個類,能夠利用這個函數把類中的方法所有註冊到server端。
四、服務端開始監聽運行server.serve_forever()
XML_RPC客戶端建立步驟:
一、 導入xmlrpclib庫模塊
二、 建立一個代理到服務端
proxy = xmlrpclib.ServerProxy('http://localhost:8000')##函數參數是URL格式
三、經過代理就能夠調用服務端的方法。函數

Eg2服務端代碼:spa

 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客戶端代碼:code

 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中。server

相關文章
相關標籤/搜索