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

XML-RPC简单使用的更多相关文章

  1. C# 构建XML(简单示例)

    C# 构建XML的简单示例: var pars = new Dictionary<string, string> { {"url","https://www. ...

  2. Linq对XML的简单操作

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  3. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...

  4. 【转】RPC简单介绍

    RPC简单介绍 RPC 1. RPC是什么 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...

  5. FOR XML PATH 简单介绍

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  6. XML系列之--对电文格式XML的简单操作(三)

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  7. 什么是XML RPC?

    # -*- coding: cp936 -*- #python 27 #xiaodeng #什么是XML RPC? #中文叫:远程过程调用 #使用http协议做传输协议的rpc机制,使用xml文本的方 ...

  8. The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly

    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly 博客分类: 解决方案_Java   问题描述:T ...

  9. 利用beans.xml进行简单的Spring应用上下文创建与使用

    继上次配置Spring完成后,我们来创建一个简单的例程来理解Spring中利用beans.xml创建应用上下文的方法. 程序路径包为:com.spring.kinghts(kinght单词拼写错误,怕 ...

  10. solr4.2 solrconfig.xml配置文件简单介绍

    对于solr4.x的每个core有两个很重要的配置文件:solrconfig.xml和schema.xml,下面我们来了解solrconfig.xml配置文件. 具体很详细的内容请细读solrcofi ...

随机推荐

  1. docker(三)反正我不喜欢敲命令,daocloud.io管理你的docker,安装远程下载工具aria2 迅雷远程下载 xware

    1.登录daocloud.io 2.寻找合适的镜像 3.查看镜像信息并部署,它给出了一个运行命令,其中有用的只是-V,目录映射,映射了物理服务器的/tddownload到容器的/xware/tddow ...

  2. Hibernate核心组件详解

    Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系型数据库中的表格与表格之间的关系.它是Java应用与关 ...

  3. js取的随机数

    Math.round(Math.random()*1000+1) ;//取得1-1000的随即数

  4. iOS9 http 不能连接的解决办法

    iOS9要求App内访问的网络必须使用HTTPS协议.原有的HTTP请求会报错,适配方法如下. 打开TARGETS-Build Phases, 添加New Run Script Phase,代码如下: ...

  5. 关闭所有的screen

    由于开了很多个screen同时工作,关闭是一个一个比较麻烦,写个命令在这以便日后想不起来时可以用到.1.先看看有多少个screen screen -ls |awk '/Socket/'|awk '{p ...

  6. Ubuntu16.04怎样安装Python3.6

    Ubuntu16.04默认安装了Python2.7和3.5 请注意,系统自带的python千万不能卸载! 输入命令python

  7. 空格填充器(alignBySpace)

    /******************************************************************* * 空格填充器(alignBySpace) * 声明: * 1 ...

  8. IplImage 与mat之间的转换及释放内存

    IplImage *x = cvLoadImage(savefilename, ); Mat img(x,true); cvReleaseImage(&x); 完

  9. spfa【模板】

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> using ...

  10. Mybatis的mapper文件中$和#的用法及区别详解

    https://www.2cto.com/database/201806/752139.html用了一段时间的Mybatis了,对于$和#的用法老是很迷糊,特此记下加深记忆. 简单来说 #{} 会在将 ...