Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1362394
  • 博文数量: 343
  • 博客积分: 13098
  • 博客等级: 上将
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-06 00:35
文章存档

2012年(131)

2011年(31)

2010年(53)

2009年(23)

2008年(62)

2007年(2)

2006年(36)

2005年(5)

分类: Python/Ruby

2011-01-14 16:28:51

这个是Python默认的XML-RPC客户库,使用Python语言编写,使用也非常的简便。
比如服务器建立了一个好像如下的方法
def fun(param1, param2):
return param1 + param2
你就可以在你的客户程序中如下简单的调用:
>>>xmlrpclib.ServerProxy(url).fun(1, 2)
3
简单的就像调用本地的方法一样,是不是。
但是在传递参数上的限制,以及效率的问题上,就……

如何实现一个RPC的提供者服务器呢?看看下面的:

SimpleXMLRPCServer

看看帮助,发现也比较简单。还是上面的例子吧,程序写在下面:
import SimpleXMLRPCServer

def fun(param1, param2):
return param1 + param2

srv = SimpleXMLRPCServer.SimpleXMLRPCServer(('localhost', 1234))
srv.register_function(fun)
srv.serve_forever()
不得不说非常简单了吧!
可是还是有人不太满意,主要就是服务器的速度实在是太慢了。于是就来了py-Xmlrpc这个模块。

py-xmlrpc

全部用C语言编写,速度好像确实不错,包括了客户端和服务器两部分。服务器中考虑了不少性能相关的事情。对于编码方面更是下足了功夫,这下子再也不怕出现xml语法错误了。但是我不得不说在它下面编写一个服务器复杂了不少,看看例子先:
import xmlrpc, sys

PORT = 1234
TEST_NAME = "xing"
TEST_PASS = "123"
TEST_AUTH = False

def doServer():
global exitFlag

exitFlag = 0
s = xmlrpc.server()
if TEST_AUTH:
s.setAuth(authenticate)
s.addMethods({
'echo' : echoMethod,
'exit' : exitMethod,
'hello' : helloMethod,
'getobj': getObjMethod,
'sum' : sumMethod
})
s.bindAndListen(PORT)
while 1:
try:
s.work() # you could set a timeout if desired
except:
e = sys.exc_info()
if e[0] in (KeyboardInterrupt, SystemExit):
raise e[0], e[1], e[2]
traceback.print_exc()
if exitFlag:
break

def authenticate(uri, name, password):
if name == TEST_NAME and password == TEST_PASS:
return (1, 'a domain')
else:
return (0, 'a domain')

# RPC:
def echoMethod(serv, src, uri, method, params):
print 'params are', params
return params

# RPC: Close the server by client side
def exitMethod(serv, src, uri, method, params):
global exitFlag
exitFlag = 1
serv.exit()
return 'okay'

# RPC: Demo function
def helloMethod (serv, src, uri, method, params):
print "Access hello:", serv, ',', src
return "Hello" + params[0] + ", welcome to python world."

#test obj
class Info_Object:
def __init__ (self, name='noname'):
self.name = name

# Globe object for call
info_obj = Info_Object()

def getObjMethod (serv, src, uri, method, params):
params[0].name = info_obj.name


def sumMethod (serv, src, uri, method, params):
sum = 0
for i in range(params[0], params[1]):
sum = sum + i
return sum


if __name__ == '__main__':
print "The XML-RPC server is work on ", PORT, '...'
doServer()

而且客户端程序也有所变化。
>>> client = xmlrpc.client('localhost', 1234)
>>> client.execute('sum', [1, 7])
21

      就我个人来看,服务器的性能重要性还是应该重视的,而Python自带的SimpleXMLRPCServer并不能完全满足现实中的需要。同时py-XMLRPC模块拥有相对高的多的性能和健壮性指标,虽然建立服务器的代码相对复杂,但是对服务器的控制手段也相应增加了不少。由于XMLRPC协议的统一性被两个服务器完全遵守,在客户端的编程中可以选取自己喜欢的开发库。相对而言我比较喜欢xmlrpclib的写法,非常简洁,好像就是在调用本地方法一样(甚至可以用本地方法的方式做测试,然后用RPC方式发布)。如果服务的主要消耗部分都在Remote端,那么使用这种纯Python客户还是值得的。
阅读(1393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~