您好,登錄后才能下訂單哦!
怎么在python中遠程調用rpc模塊中的xmlrpclib方法?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
RPC(Remote Procedure Call Protocol)是遠程調用協議,它通過網絡請求服務到遠端服務器,服務器根據請求做出響應,將結果返回
它是一種C/S模式,客戶端可以調用遠程服務器上的參數(類似URL)并返回結果
利用rpc可以實現系統的分布式架構,可以將功能分解到多臺服務器上進行實現,同時也將也可以將負載打散,分布到不同服務器上,整合計算資源
在openstack中就大量使用了rpc
rpc多使用http傳輸請求,格式有xml,json等,這里是xml
模塊:
xmlrpclib
注:xmlrpclib模塊在python3中重命名為xmlrpc.client
xmlrpc并不是很安全,但在2.7.9 https url中默認加入了證書,主機名驗證
定義:
class xmlrpclib.ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime[, context]]]]]])
1.uri,即服務端的url地址
2.transport 傳輸實例,可選,https urls/http
3.encoding
4.verbose 是debug模式
5.allow_none 是否請求空 ,若為True,那么常量none將被翻譯成xml,默認如果是none則拋出異常 TypeError
6.use_datetime 可以使用date/time values記錄調用時間datetime.datetime,默認是false
ServerProxy對象提供一些默認的方法:
1.ServerProxy.system.listMethods() 返回遠端服務器方法列表
2.ServerProxy.system.methodSignature(name) 方法簽名,是一個數組類型
3.ServerProxy.system.methodHelp(name) 方法幫助信息
例如一個簡單的示例:
服務端:
import xmlrpclib from SimpleXMLRPCServer import SimpleXMLRPCServer def get_power(n,m): return n**m server = SimpleXMLRPCServer(("0.0.0.0", 8081)) print "start service get power on 0.0.0.0 8081..." server.register_function(get_power, "get_power") server.serve_forever()
客服端:
import xmlrpclib server_power = xmlrpclib.ServerProxy("http://192.168.137.9:8081/") print "3**2 = %d" %(server_power.get_power(3,2)) print "2**5 = %d" %(server_power.get_power(2,5))
結果:
服務端:
# python xml_server.py start service get power on 0.0.0.0 8081... 192.168.137.9 - - [22/May/2017 10:37:47] "POST / HTTP/1.1" 200 - 192.168.137.9 - - [22/May/2017 10:37:47] "POST / HTTP/1.1" 200 -
客服端:
# python xml_client.py 3**2 = 9 2**5 = 32
xmlrpclib提供的一些方法:
class xmlrpclib.DateTime 時間對象
例如:
服務端:
import datetime from SimpleXMLRPCServer import SimpleXMLRPCServer import xmlrpclib def today(): today = datetime.datetime.today() return xmlrpclib.DateTime(today) server = SimpleXMLRPCServer(("0.0.0.0", 8081)) print "start service on 0.0.0.0 8081..." server.register_function(today, "today") server.serve_forever()
客服端:
import xmlrpclib import datetime s = xmlrpclib.ServerProxy("http://192.168.137.9:8081/") today = s.today() converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S") print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")
結果:
服務端
# python rpc_time.py start service on 0.0.0.0 8081... 192.168.137.9 - - [22/May/2017 10:43:19] "POST / HTTP/1.1" 200 -
客服端:
# python rpc_time_client.py Today: 22.05.2017, 10:43
2.class xmlrpclib.Binary 二進制對象
3.class xmlrpclib.Fault fault對象
如:
客服端:
import xmlrpclib s = xmlrpclib.ServerProxy("http://192.168.137.9:8081/") try: s.add(2, 5) except xmlrpclib.Fault as err: print "A fault occurred" print "Fault code: %d" % err.faultCode print "Fault string: %s" % err.faultString
class xmlrpclib.MultiCall(server) 提供多個調用,復合調用:
例如:
from SimpleXMLRPCServer 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 def get_power(n,m): return n**m server = SimpleXMLRPCServer(("0.0.0.0", 8081)) print "start service on 0.0.0.0 8081..." 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.register_function(get_power, 'get_power') server.serve_forever()
客服端:
import xmlrpclib s = xmlrpclib.ServerProxy("http://192.168.137.9:8081/") multicall = xmlrpclib.MultiCall(s) multicall.add(7,3) multicall.subtract(7,3) multicall.multiply(7,3) multicall.divide(7,3) multicall.get_power(7,3) result = multicall() print "7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d 7**3=%d" % tuple(result)
服務端:
# python mul_xmlserver.py start service on 0.0.0.0 8081... 192.168.137.9 - - [22/May/2017 10:51:59] "POST / HTTP/1.1" 200 -
客服端:
# python mul_xmlclient.py 7+3=10, 7-3=4, 7*3=21, 7/3=2 7**3=343
另外xmlrpc還提供有比較快捷的函數:
1.xmlrpclib.boolean(value) 將任意的python值轉換成xmlrpc的布爾類型True/False
2.xmlrpclib.dumps(params[, methodname[, methodresponse[, encoding[, allow_none]]]])
params請求轉換為xml
3.xmlrpclib.loads(data[, use_datetime])
將一個xml-rpc的請求轉換成python對象
例如:
from xmlrpclib import ServerProxy, Error server = ServerProxy("http://betty.userland.com") print server try: print server.examples.getStateName(41) except Error as err: print "ERROR", err
客服端:
import xmlrpclib, httplib class ProxiedTransport(xmlrpclib.Transport): def set_proxy(self, s): self.s = s def make_connection(self, host): self.realhost = host h = httplib.HTTPConnection(self.s) return h def send_request(self, connection, handler, request_body): connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler)) def send_host(self, connection, host): connection.putheader('Host', self.realhost) p = ProxiedTransport() p.set_proxy('proxy-server:8080') server = xmlrpclib.ServerProxy('http://time.xmlrpc.com/RPC2', transport=p) print server.currentTime.getCurrentTime()
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。