python远程调用rpc模块xmlrpclib的方法
RPC(RemoteProcedureCallProtocol)是远程调用协议,它通过网络请求服务到远端服务器,服务器根据请求做出响应,将结果返回
它是一种C/S模式,客户端可以调用远程服务器上的参数(类似URL)并返回结果
利用rpc可以实现系统的分布式架构,可以将功能分解到多台服务器上进行实现,同时也将也可以将负载打散,分布到不同服务器上,整合计算资源
在openstack中就大量使用了rpc
rpc多使用http传输请求,格式有xml,json等,这里是xml
模块:
xmlrpclib
注:xmlrpclib模块在python3中重命名为xmlrpc.client
xmlrpc并不是很安全,但在2.7.9httpsurl中默认加入了证书,主机名验证
定义:
classxmlrpclib.ServerProxy(uri[,transport[,encoding[,verbose[,allow_none[,use_datetime[,context]]]]]])
1.uri,即服务端的url地址
2.transport传输实例,可选,httpsurls/http
3.encoding
4.verbose是debug模式
5.allow_none是否请求空,若为True,那么常量none将被翻译成xml,默认如果是none则抛出异常TypeError
6.use_datetime可以使用date/timevalues记录调用时间datetime.datetime,默认是false
ServerProxy对象提供一些默认的方法:
1.ServerProxy.system.listMethods()返回远端服务器方法列表
2.ServerProxy.system.methodSignature(name)方法签名,是一个数组类型
3.ServerProxy.system.methodHelp(name)方法帮助信息
例如一个简单的示例:
服务端:
importxmlrpclib
fromSimpleXMLRPCServerimportSimpleXMLRPCServer
defget_power(n,m):
returnn**m
server=SimpleXMLRPCServer(("0.0.0.0",8081))
print"startservicegetpoweron0.0.0.08081..."
server.register_function(get_power,"get_power")
server.serve_forever()
客服端:
importxmlrpclib
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))
结果:
服务端:
#pythonxml_server.py startservicegetpoweron0.0.0.08081... 192.168.137.9--[22/May/201710:37:47]"POST/HTTP/1.1"200- 192.168.137.9--[22/May/201710:37:47]"POST/HTTP/1.1"200-
客服端:
#pythonxml_client.py 3**2=9 2**5=32
xmlrpclib提供的一些方法:
classxmlrpclib.DateTime时间对象
例如:
服务端:
importdatetime
fromSimpleXMLRPCServerimportSimpleXMLRPCServer
importxmlrpclib
deftoday():
today=datetime.datetime.today()
returnxmlrpclib.DateTime(today)
server=SimpleXMLRPCServer(("0.0.0.0",8081))
print"startserviceon0.0.0.08081..."
server.register_function(today,"today")
server.serve_forever()
客服端:
importxmlrpclib
importdatetime
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")
结果:
服务端
#pythonrpc_time.py startserviceon0.0.0.08081... 192.168.137.9--[22/May/201710:43:19]"POST/HTTP/1.1"200-
客服端:
#pythonrpc_time_client.py Today:22.05.2017,10:43
2.classxmlrpclib.Binary二进制对象
3.classxmlrpclib.Faultfault对象
如:
客服端:
importxmlrpclib
s=xmlrpclib.ServerProxy("http://192.168.137.9:8081/")
try:
s.add(2,5)
exceptxmlrpclib.Faultaserr:
print"Afaultoccurred"
print"Faultcode:%d"%err.faultCode
print"Faultstring:%s"%err.faultString
classxmlrpclib.MultiCall(server)提供多个调用,复合调用:
例如:
fromSimpleXMLRPCServerimportSimpleXMLRPCServer
defadd(x,y):
returnx+y
defsubtract(x,y):
returnx-y
defmultiply(x,y):
returnx*y
defdivide(x,y):
returnx/y
defget_power(n,m):
returnn**m
server=SimpleXMLRPCServer(("0.0.0.0",8081))
print"startserviceon0.0.0.08081..."
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()
客服端:
importxmlrpclib
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=%d7**3=%d"%tuple(result)
服务端:
#pythonmul_xmlserver.py startserviceon0.0.0.08081... 192.168.137.9--[22/May/201710:51:59]"POST/HTTP/1.1"200-
客服端:
#pythonmul_xmlclient.py 7+3=10,7-3=4,7*3=21,7/3=27**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对象
例如:
fromxmlrpclibimportServerProxy,Error
server=ServerProxy("http://betty.userland.com")
printserver
try:
printserver.examples.getStateName(41)
exceptErroraserr:
print"ERROR",err
客服端:
importxmlrpclib,httplib
classProxiedTransport(xmlrpclib.Transport):
defset_proxy(self,s):
self.s=s
defmake_connection(self,host):
self.realhost=host
h=httplib.HTTPConnection(self.s)
returnh
defsend_request(self,connection,handler,request_body):
connection.putrequest("POST",'http://%s%s'%(self.realhost,handler))
defsend_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)
printserver.currentTime.getCurrentTime()
以上这篇python远程调用rpc模块xmlrpclib的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。