编写客户端提交数据到服务器处理是程序员最常碰到的几个问题之一。各种不同的语言对此都有相应的解决方案。比如Unix下,C程序员们可以用SUNRPC,Java程序员则使用RMI来处理。大多数语言还都可以使用Web Service或者ICE。它们的使用方法类似,编写一个接口定义文件,用一个工具处理并生成代码,加入到工程中,最后编译生成目标文件运行。有用过这类工具的朋友们,脑子里应该都会闪出一个字——烦!真的是谁用谁知道。

Python同样也提供了一个基于XMLRPC的解决方案,不过用法很简单:

  • 首先,就好像在编写普通的程序那样子编写服务器。
  • 接着使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象。
  • 最后,在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可。

一个最简单的hello,word示例:

#helloserver.py
from SimpleXMLRPCServer import SimpleXMLRPCServer
def hello():print "hello,world!"svr = SimpleXMLRPCServer(("", 8080), allow_none=True)
svr.register_function(hello)
svr.serve_forever()#helloclient.py
from xmlrpclib import ServerProxy
svr = ServerProxy("http://localhost:8080")
svr.hello()

先后运行helloserver.py和helloclient.py就可以看到控制台输出hello,world。

不过,美中不足的是,SimpleXMLRPCServer是一个单线程的服务器。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续。这里有个技巧解决这个问题:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):pass

现在把helloserver改一改:

svr = ThreadXMLRPCServer(("", 8080), allow_none=True)

现在服务器就支持多线程并发了。

XMLRPC一个标准协议,定义了如何使用HTTP和XML来传递多种类型数据。据我观察,xmlrpclib对于日期/时间类型的有特殊的支持。假如有一个服务器提供的函数是: def toluar(d):pass

这原本是一个将阳历转换成阴历的函数。要求d是datetime模块里的datetime类型。虽然客户端确实传入的确实是datetime类型,服务器却会将其解释为xmlrpclib.DateTime类型。 解决办法是:

class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
#从SimpleXMLRPCServer模块抄出来的代码
def _marshaled_dispatch(self, data, dispatch_method = None):try:params, method = xmlrpclib.loads(data, use_datetime=True) #这里加了一个use_datetime# generate responseif dispatch_method is not None:response = dispatch_method(method, params)else:response = self._dispatch(method, params)# wrap response in a singleton tupleresponse = (response,)response = xmlrpclib.dumps(response, methodresponse=1,allow_none=self.allow_none, encoding=self.encoding)except Fault, fault:response = xmlrpclib.dump(fault,allow_none=self.allow_none,
encoding=self.encoding)except:# report exception back to serverexc_type, exc_value, exc_tb = sys.exc_info()response = xmlrpclib.dumps(xmlrpclib.Fault(1, "%s:%s" %(exc_type,exc_value)),encoding=self.encoding,allow_none=self.allow_none,
)return response

客户端方面则比较简单:

svr = ServerProxy(http://localhost:8080/,allow_none=True,use_datetime=True)

注意 use_datetime参数默认是False

来源:http://blog.chinaunix.net/uid-20544356-id-132398.html

转载于:https://www.cnblogs.com/skeeter/p/3546714.html

【转】Python的XML-RPC简介相关推荐

  1. Python和xml简介

    python提供越来越多的技术来支持xml,本文旨在面向初学利用Python处理xml的读者,以教程的形式介绍一些基本的xml出来概念.前提是读者必须知道一些xml常用术语. 先决条件 本文所有的例子 ...

  2. 用Python解析XML的几种常见方法的介绍

    这篇文章主要介绍了用Python解析XML的几种常见方法,包括快速的使用ElementTree模块等方法的实例介绍,需要的朋友可以参考下 一.简介 XML(eXtensible Markup Lang ...

  3. python中set()函数的用法,python中set()函数简介及实例解析

    python中set()函数简介及实例解析 set函数也是python内置函数的其中一个,属于比较基础的函数.其具体介绍和使用方法,下面进行介绍. set() 函数创建一个无序不重复元素集,可进行关系 ...

  4. Go语言:RPC简介及原理介绍

    背景 在前面的课程<Go语言微服务理论与实践课程>课程中,我们已经学习了微服务的理论知识,了解了微服务实践中需要解决哪些问题.从本篇技术文档开始,我们进入新的微服务内容的学习.在本系列课程 ...

  5. python:XML处理模块

    python:XML处理模块 简介 XML 漏洞 defusedxml 包 简介 用于处理XML的Python接口分组在 xml 包中. 警告 XML 模块对于错误或恶意构造的数据是不安全的. 如果你 ...

  6. python读取xml文件报错ValueError: multi-byte encodings are not supported

    1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执 ...

  7. python之XML文件解析

    python对XML的解析 常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同. python有三种方法解析XML,分别是SAX,DOM,以及ElementT ...

  8. python 解析xml

    在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...

  9. 用python将xml文件转换为txt文件_python代码xml转txt实例

    为了训练深度学习模型,经常要整理大量的标注数据,需统一不同格式的标注数据,一般情况下习惯读取TXT格式的数据.但实际中经常遇到XML格式的标注数据,在此举例:1.读取XML标注数据:2.写入TXT文件 ...

  10. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介...

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

最新文章

  1. 路由器虚拟服务器功能(广域网服务端口和局域网服务端口的映射关系)
  2. 11月最佳机器学习开源项目Top10!
  3. 【cJSon】cJSON学习笔记(一)
  4. hive日志位置(日志定位报错:Failed with exception Unable to move sourcehdfs://namenode/tmp/hive-pmp_bi/h)...
  5. C++(20)--类型自动转换
  6. 史上最强Dubbo面试28题答案详解:核心功能+服务治理+架构设计等
  7. 学计算机的如何学英语,怎么在电脑上学习英语
  8. java弱_Java 强、弱、软、虚,你属于哪一种?
  9. c语言图片添加水印程序,[求助]C语言 bmp文件加上水印
  10. 学经济为什么学python_工具&方法丨划重点 ! 经济学专业学Python需要学哪些内容?——数据分析处理必知必会的知识点...
  11. 【操作系统】为什么需要内核
  12. 大数据技术及大数据架构
  13. 表面缺陷检测的意义及现状
  14. 本实例要求输出名言“贵有恒,何必三更起五更睡:最无益,只怕一日曝十日寒。
  15. ultraedit25版本设置文本自动换行方法
  16. AngularJS中文入门教程
  17. Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载
  18. 考研这么累,是什么让你坚持下来的?
  19. qt中新增html,Qt和HTML笔记:初始化
  20. 模拟浏览器抓取淘宝书籍数据

热门文章

  1. [转]C#和C++结构体Socket通信
  2. Excel 货币中文大写汉字转化
  3. java 接口api设计的注意事项_Java接口设计原则
  4. 用于数据科学的Python库,命令行工具,Jenkins X,DevOps,Perl 6等
  5. 我如何开始使用Linux
  6. SecureDrop 0.3,LibreOffice Online和更多新闻
  7. VSCode自定义代码片段11——vue路由的配置
  8. CSS3 响应式布局之响应式图片
  9. java怎么检测代码安全_foritfy代码安全审计、foritfy代码检测服务、java代码安全审计检测、C/C++语言代码安全审计检测...
  10. 连续系统PID及其离散化 位置式PID以及增量式PID