• 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">
  • 相关阅读:
    linux中内存使用,swap,cache,buffer的含义总结
    haproxy启动时提示失败
    pcs与crmsh命令比较
    用yum下载rpm包(不安装)到指定目录
    Openstack的镜像属性
    ceph 对接openstack liberty
    ceph 创建和删除osd
    linux之fstab文件详解
    OpenStack Swift集群部署流程与简单使用
    swift(Object Storage对象存储服务)(单节点)
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6716263.html
Copyright © 2020-2023  润新知