python遠(yuǎn)程調(diào)用rpc模塊xmlrpclib的方法
RPC(Remote Procedure Call Protocol)是遠(yuǎn)程調(diào)用協(xié)議,它通過(guò)網(wǎng)絡(luò)請(qǐng)求服務(wù)到遠(yuǎn)端服務(wù)器,服務(wù)器根據(jù)請(qǐng)求做出響應(yīng),將結(jié)果返回
它是一種C/S模式,客戶端可以調(diào)用遠(yuǎn)程服務(wù)器上的參數(shù)(類似URL)并返回結(jié)果
利用rpc可以實(shí)現(xiàn)系統(tǒng)的分布式架構(gòu),可以將功能分解到多臺(tái)服務(wù)器上進(jìn)行實(shí)現(xiàn),同時(shí)也將也可以將負(fù)載打散,分布到不同服務(wù)器上,整合計(jì)算資源
在openstack中就大量使用了rpc
rpc多使用http傳輸請(qǐng)求,格式有xml,json等,這里是xml
模塊:
xmlrpclib
注:xmlrpclib模塊在python3中重命名為xmlrpc.client
xmlrpc并不是很安全,但在2.7.9 https url中默認(rèn)加入了證書(shū),主機(jī)名驗(yàn)證
定義:
class xmlrpclib.ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime[, context]]]]]])
1.uri,即服務(wù)端的url地址
2.transport 傳輸實(shí)例,可選,https urls/http
3.encoding
4.verbose 是debug模式
5.allow_none 是否請(qǐng)求空 ,若為True,那么常量none將被翻譯成xml,默認(rèn)如果是none則拋出異常 TypeError
6.use_datetime 可以使用date/time values記錄調(diào)用時(shí)間datetime.datetime,默認(rèn)是false
ServerProxy對(duì)象提供一些默認(rèn)的方法:
1.ServerProxy.system.listMethods() 返回遠(yuǎn)端服務(wù)器方法列表
2.ServerProxy.system.methodSignature(name) 方法簽名,是一個(gè)數(shù)組類型
3.ServerProxy.system.methodHelp(name) 方法幫助信息
例如一個(gè)簡(jiǎn)單的示例:
服務(wù)端:
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))
結(jié)果:
服務(wù)端:
# 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 時(shí)間對(duì)象
例如:
服務(wù)端:
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")
結(jié)果:
服務(wù)端
# 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 二進(jìn)制對(duì)象
3.class xmlrpclib.Fault fault對(duì)象
如:
客服端:
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) 提供多個(gè)調(diào)用,復(fù)合調(diào)用:
例如:
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)
服務(wù)端:
# 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還提供有比較快捷的函數(shù):
1.xmlrpclib.boolean(value) 將任意的python值轉(zhuǎn)換成xmlrpc的布爾類型True/False
2.xmlrpclib.dumps(params[, methodname[, methodresponse[, encoding[, allow_none]]]])
params請(qǐng)求轉(zhuǎn)換為xml
3.xmlrpclib.loads(data[, use_datetime])
將一個(gè)xml-rpc的請(qǐng)求轉(zhuǎn)換成python對(duì)象
例如:
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()
以上這篇python遠(yuǎn)程調(diào)用rpc模塊xmlrpclib的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
對(duì)python中的*args與**kwgs的含義與作用詳解
今天小編就為大家分享一篇對(duì)python中的*args與**kwgs的含義與作用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python使用socket實(shí)現(xiàn)圖像傳輸功能
這篇文章主要為大家詳細(xì)介紹了python使用socket實(shí)現(xiàn)圖像傳輸功能,linux服務(wù)器與win10主機(jī)間的圖像傳輸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
Python調(diào)用易語(yǔ)言動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)驗(yàn)證碼功能
今天成功把易語(yǔ)言調(diào)用驗(yàn)證碼通殺的DLL在Python中成功調(diào)用了,心理美滋滋的,接著把我的經(jīng)驗(yàn)及示例代碼分享給大家,希望對(duì)大家有所幫助2021-08-08
Python標(biāo)準(zhǔn)庫(kù)os庫(kù)的常用功能解析
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)os庫(kù)的常用功能解析,os庫(kù)是Python標(biāo)準(zhǔn)庫(kù)之一,它提供了非常豐富的文件及目錄讀寫(xiě)的方法2022-07-07
Python求解任意閉區(qū)間的所有素?cái)?shù)
本篇文章是一篇關(guān)于python求素?cái)?shù)的知識(shí)點(diǎn)內(nèi)容,如果大家在應(yīng)用中有用的到,不妨跟著學(xué)習(xí)下。2018-06-06
使用python求解迷宮問(wèn)題的三種實(shí)現(xiàn)方法
關(guān)于迷宮問(wèn)題,常見(jiàn)會(huì)問(wèn)能不能到達(dá)某點(diǎn),以及打印到達(dá)的最短路徑,下面這篇文章主要給大家介紹了關(guān)于如何使用python求解迷宮問(wèn)題的三種實(shí)現(xiàn)方法,需要的朋友可以參考下2022-03-03
利用Python第三方庫(kù)xlrd讀取Excel中數(shù)據(jù)實(shí)例代碼
python操作excel主要用到xlrd和xlwt這兩個(gè)庫(kù),即xlrd是讀excel,xlwt是寫(xiě)excel的庫(kù),下面這篇文章主要給大家介紹了關(guān)于利用Python第三方庫(kù)xlrd讀取Excel中數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

