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