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

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

(0)

相关推荐

  • python使用PIL模块获取图片像素点的方法

    如下所示: from PIL import Image ########获取图片指定像素点的像素 def getPngPix(pngPath = "aa.png",pixelX = 1,pixelY = 1):     img_src = Image.open(pngPath)     img_src = img_src.convert('RGBA')     str_strlist = img_src.load()     data = str_strlist[pixelX,pixe

  • 在Python中关于使用os模块遍历目录的实现方法

    一.Python中os模块的常见的使用方法 os.listdir(path):遍历path的文件或者文件夹,返回一个列表 os.path.join(path1,path2,--,pathn):拼接路径 os.path.isdir(path):判断此路径对应的是否是文件夹 os.path.isfile(path):判断是否是文件 os.path.dirname(path):返回路径的文件夹名 os.path.filename(path):返回路径的文件名 os.getcwd():获取当前路径 二.

  • Python模块的加载讲解

    不管是用import还是用from mmmm import *的方式导入模块,当程序运行之后,回头在看那个存储着mmmm.py文件的目录中,多了一个文件: $ ls mmm* mmmm.py mmmm.pyc 在这个目录下面,除了原来的那个mmmm.py之外,又多了一个mmmm.pyc文件,这个文件不是我写的,需要用import的过程说起. import的工作流程 import mmmm,并不是仅仅将mmmm.py这个文件装载到当前位置(文件内),其实是首先进行了一次运算.当mmmm.py被第一

  • 对python模块中多个类的用法详解

    如下所示: import wuhan.wuhan11 class Han: def __init__(self, config): self.batch_size = config.batch_size self.num_steps = config.num_steps class config: batch_size = 10 num_steps = 50 if __name__ == '__main__': han = Han(config) print(han.batch_size) pr

  • Python线程池模块ThreadPoolExecutor用法分析

    本文实例讲述了Python线程池模块ThreadPoolExecutor用法.分享给大家供大家参考,具体如下: python3内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致. 首先导入模块 from concurrent.futures import ThreadPoolExecutor 使用方法很简单,最常用的可能就

  • python 内置模块详解

    一.random模块  随机     random()    随机小数            uninform(a,b) 随机小数 randint(a,b)  随机整数 choice() 随机选择一个 sample() 随机选择多个 shuffle() 打乱 import random from random import randint print(randint(10, 20)) # print(random.randint(10, 20))/ print(random.random())

  • python 使用poster模块进行http方式的文件传输到服务器的方法

    这几天帮内部人员做一个文件传输的小工具,要用http的方式,在用django搭建了个小框架之后,如何进行传输,特别是大文件的传输,成为主要问题.经过查资料,最后选择了通过poster这个模块来进行文件的传输,方式如下: from poster.encode import multipart_encode from poster.streaminghttp import register_openers import urllib2 def upload_file(url,upload_file_

  • python3安装speech语音模块的方法

    在windows平台上使用pyhton编写语音识别程序需要用到speech模块,speech模块支持的主要功能有:文本合成语音,将键盘输入的文本信息转换为语音信号方式输出:语音识别,将输入的语音信号转为文本等功能 1.安装pywin32,pywin32即Python for Windows Extensions,提供了Pyhton访问和调用Windows底层功能函数的接口,pywin32包括了win32api.win32com.win32gui.win32process等模块,下载地址:http

  • python PrettyTable模块的安装与简单应用

    prettyTable 是一款很简洁但是功能强大的第三方模块,主要是将输入的数据转化为格式化的形式来输出,即:以表格的形式的打印输出出来,能够起到美观的效果,今天简单地试用了一下, 一.下载与安装 进入pypi.python.org查找并下载PrettyTable将其放在Python文件夹下的Scripts文件夹下 进入命令提示符工具,转到Scripts文件夹下,通过命令pip install prettytable-0.7.2.tar.bz2安装该模块 二.简单的使用 导入该模块 from p

  • python使用xlrd模块读取xlsx文件中的ip方法

    程序中经常需要使用excel文件,批量读取文件中的数据 python读取excel文件可以使用xlrd模块 pip install xlrd安装模块 示例: #coding=utf8 import xlrd from os import path import sys filename='ip.xlsx' if not path.isfile(filename): print "err: not exists or not file ip.xlsx " sys.exit() getfi

随机推荐