1.源代码下载及安装:http://www.tornadoweb.org/en/stable/
2.python中xmlrpc库官方文档:https://docs.python.org/3/library/xmlrpc.html?highlight=xmlrpc
3.xml介绍与学习:http://www.w3school.com.cn/xml/xml_intro.asp
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
python类库xmlrpc的使用
一、简介
XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a transport. With it, a client can call methods with parameters on a remote server (the server is named by a URI) and get back structured data. This module supports writing XML-RPC client code; it handles all the details of translating between conformable Python objects and XML on the wire.
简单地,client可以调用server上提供的方法,然后得到执行的结果。类似于webservice。
为了解决在系统的80端口提供RPC的服务,而又不影响正在执行的WEB服务,人们想出了用HTTP协议传输RPC包的办法。对于几乎是专门用于传输文本的HTTP协议,要在其上传输RPC封包,最方便的方法莫过于把RPC封包编码成文本形式——例如XML文件。
XML- RPC(http://www.xml-rpc.com)是由美国UserLand公司指定的一个RPC协议。它将RPC信息封包编码为XML,然后通过 HTTP传输封包;
简单的理解:
将数据定义为xml格式,通过http协议进行远程传输
二、好处
1. 传输复杂的数据。
2. 通过程序语言的封装,实现远程对象的调用。
三、Python中xmlrpc应用
服务端:
1 import calendar, SimpleXMLRPCServer 2 #The server object 3 class Calendar: 4 def getMonth(self, year, month): 5 return calendar.month(year, month) 6 def getYear(self, year): 7 return calendar.calendar(year) 8 9 calendar_object = Calendar() 10 server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 7788)) 11 server.register_instance(calendar_object) 12 #Go into the main listener loop 13 print "Listening on port 7788" 14 server.serve_forever()
客户端:
import xmlrpclib server = xmlrpclib.ServerProxy("http://localhost:7788") month = server.getMonth(2002, 8) print month
执行结果:
August 2002
Mo Tu We Th Fr Sa Su
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
PS1:以上代码的python环境为 python2.6,需要注意端口的使用情况,如果程序中使用的端口已经被占用会报错。
当运行服务端的程序后,执行命令:netstat -an|grep 7788,显示以下信息:
127.0.0.1.7788 *.* 0 0 128000 0 LISTEN
PS2:SimpleXMLRPCServer是一个单线程的服务器。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续。
这里有个技巧解决这个问题:
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):pass
现在把服务端改一改:
svr=ThreadXMLRPCServer(("", 8080), allow_none=True)
现在服务器就支持多线程并发了。
来源 -- http://blog.chinaunix.net/uid-20544356-id-132398.html
服务端:
1 from xmlrpc.server import SimpleXMLRPCServer 2 from xmlrpc.server import SimpleXMLRPCRequestHandler 3 4 def div(x,y): 5 return x - y 6 7 class Math: 8 def _listMethods(self): 9 # this method must be present for system.listMethods 10 # to work 11 return ['add', 'pow'] 12 def _methodHelp(self, method): 13 # this method must be present for system.methodHelp 14 # to work 15 if method == 'add': 16 return "add(2,3) => 5" 17 elif method == 'pow': 18 return "pow(x, y[, z]) => number" 19 else: 20 # By convention, return empty 21 # string if no help is available 22 return "" 23 def _dispatch(self, method, params): 24 if method == 'pow': 25 return pow(*params) 26 elif method == 'add': 27 return params[0] + params[1] 28 else: 29 raise 'bad method' 30 31 server = SimpleXMLRPCServer(("localhost", 8000)) 32 server.register_introspection_functions() 33 server.register_function(div,"div") 34 server.register_function(lambda x,y: x*y, 'multiply') 35 server.register_instance(Math()) 36 server.serve_forever()
客户端:
1 import xmlrpc.client 2 3 s = xmlrpc.client.ServerProxy('http://localhost:8000') 4 5 print(s.system.listMethods()) 6 7 print(s.pow(2,3)) # Returns 8 8 print(s.add(2,3)) # Returns 5 9 print(s.div(3,2)) # Returns 1 10 print(s.multiply(4,5)) # Returns 20
执行结果:
['add', 'div', 'multiply', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
8
5
1
20
PS1:以上代码的python环境为 python3.2