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 返回汉字的汉语拼音
Feb 27 Python
Python实现获取某天是某个月中的第几周
Feb 11 Python
Python中将字典转换为列表的方法
Sep 21 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
python psutil监控进程实例
Dec 17 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
python unichr函数知识点总结
Dec 16 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
php&java(三)
2006/10/09 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
php的hash算法介绍
2014/02/13 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
Vue中计算属性computed的示例解读
2017/07/26 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
element el-input directive数字进行控制
2018/10/11 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
TensorFlow实现模型评估
2018/09/07 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
python switch 实现多分支选择功能
2020/12/21 Python
乌克兰在线药房:Аптека24
2019/10/30 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
新闻发布会主持词
2014/03/28 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
农村文化建设标语
2014/10/07 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
Golang流模式之grpc的四种数据流
2022/04/13 Golang