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">