前言: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") # 调用某个对象里的函数