XML-RPC簡單使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM