python远程调用rpc模块xmlrpclib的方法


Posted in Python onJanuary 11, 2019

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()

以上这篇python远程调用rpc模块xmlrpclib的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的检测web服务器健康状况的小程序
Sep 17 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
Mar 30 Python
Python文件去除注释的方法
May 25 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python 伯努利分布详解
Feb 25 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
python实现二分查找算法
Sep 18 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 #Python
python PrettyTable模块的安装与简单应用
Jan 11 #Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 #Python
pyqt5实现俄罗斯方块游戏
Jan 11 #Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 #Python
对python多线程中Lock()与RLock()锁详解
Jan 11 #Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 #Python
You might like
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
php源码的安装方法和实例
2019/09/26 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
微信小程序canvas实现签名功能
2021/01/19 Javascript
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
django框架两个使用模板实例
2019/12/11 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
Python调用C语言程序方法解析
2020/07/07 Python
python 实现图片批量压缩的示例
2020/12/18 Python
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
工程部经理岗位职责
2013/12/08 职场文书
班组长安全生产职责
2013/12/16 职场文书
春季运动会开幕词
2015/01/28 职场文书
优秀教师个人总结
2015/02/11 职场文书
专项资金申请报告
2015/05/15 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书