您的位置:首页 > 其它

注册并发布一个xmlrpc远程对象(函数、类对象、客户端使用调用(对象.方法)格式)

2012-09-14 11:24 731 查看
前言:SimpleXMLRPCServer顾名思义就是实现XML-RPC的远程调用服务器

服务器端:

from SimpleXMLRPCServer import SimpleXMLRPCServer  #服务器端
import logging
import os

logging.basicConfig(level=logging.DEBUG)  #记录日志级别为DEBUG

server = SimpleXMLRPCServer(('localhost', 9000), logRequests=True)  #绑定到9000端口 假如指定allow_none=True,接受返回值是none

def list_contents(dir_name):  #一个响应操作方法
logging.debug('list_contents(%s)', dir_name)  #记录日志
return os.listdir(dir_name)  #给客户端返回结果,这个例子返回当前目录的所有文件名
def my_function(a, b): #这个响应方法含有参数
return a * b
class DirectoryService: #一个响应类
def list(self, dir_name):
return os.listdir(dir_name)
class ServiceRoot:  #添加一个空类
pass

class DirectoryService:  #这个类是定义响应方法的类
def list(self, dir_name):
return os.listdir(dir_name)

root = ServiceRoot()
root.dir = DirectoryService()  #就是为了在使用ServiceRoot.dir的时候找到DirectoryService()
server.register_function(list_contents,'dir')  #在服务器注册这个方法 会表示把这个方法重定义成'dir',客户端使用proxy.dir而不是proxy.list_contents
server.register_function(os.mkdir, 'dir.create')  #注册的方法别名也支持'.',这里这个方法是proxy.dir.create
server.register_function(my_function, 'multiply args')  #这个在调用时是getattr(proxy, 'multiply args')(5, 5) 使用getattr是因为这个注册的方法名字'multiply args'含有空格
server.register_instance(DirectoryService())  #用类的方法注册  只在在客户端使用proxy.list (list是这个类中定义的方法)
server.register_instance(root, allow_dotted_names=True) #指定容许类中的'.' 这样调用:proxy.dir.list
try:
print 'Use Control-C to exit'
server.serve_forever()  #loop运行
except KeyboardInterrupt:
print 'Exiting'


客户端:

import xmlrpclib  #客户端

proxy = xmlrpclib.ServerProxy('http://localhost:9000')
print proxy.list_contents('/tmp') #使用上面注册的这个方法找到'/tmp'下的所有文件名
print  proxy.dir.list("xx") # 调用某个对象里的函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐