RPC(Remote Procedure Call)即远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术。这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。
它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。
这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。
Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。
Python下的XML-RPC:
1、类库:xmlrpclib 一般使用在客户端,这个模块用来调用注册在XML-RPC服务器端的函数,xmlrpclib并不是一个类型安全的模块,无法抵御恶意构造的数据,这方面的一些处理工作需要交给开发者自己。
2、类库:SimpleXMLRPCServer 一般是用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架
代码:
xml_rpc_server.py
# coding=utf-8 import os import SimpleXMLRPCServer # 获取当前路径 def pwd(): return os.getcwd() # 列出指定目录中的内容 def ls(directory=None): if directory is None: directory = pwd() try: return os.listdir(directory) except OSError as e: return e # 改变工作路径 def cd(directory): try: os.chdir(directory) except OSError as e: return e return 'change current working direcotry to: %s' % (directory) # 创建目录 def mkdir(directory): try: os.mkdir(directory) except OSError as e: return e else: return 'successfully create directory: %s' % directory # 文件拷贝 def cp(src, dest): with open(src, 'r') as fin: with open(dest, 'w') as fout: fout.write(fin.read()) return 'copy %s->%s' % (src, dest) class Person(object): def __init__(self, name, age): self._name = name self._age = age def show(self): return str(self) def __str__(self): return 'Person(name=%s,age=%s' % (self._name, self._age) if __name__ == "__main__": s = SimpleXMLRPCServer.SimpleXMLRPCServer(('0.0.0.1', 8000)) s.register_function(pwd) # 注册函数 s.register_function(ls) s.register_function(cd) s.register_function(mkdir) s.register_function(cp) p = Person('python', 28) s.register_instance(p) # 注册对象实例 s.serve_forever()
启动xml_rpc服务器:
python xml_rpc_server.py
测试:
>>> import xmlrpclib >>> x = xmlrpclib.ServerProxy('http://192.168.87.200:8000') >>> x.pwd() #获取服务器所在路径 '/home/hupeng/WorkSpace/Python/xml_rpc' >>> x.ls() ['1.txt', 'xml_rpc_server.py'] >>> x.cp('1.txt','2.txt') 'copy 1.txt->2.txt' >>> x.mkdir('tmp') 'successfully create directory: tmp' >>> x.show() #调用对象的show方法 'Person(name=python,age=28)'
注意:
注册的函数要有返回值,否则可能会出现如下错误:
Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal None unless allow_none is enabled">