|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我选了PYTHON的选修课,想做一个XMLRPC的那个项目,在并不是很懂的情况下,连学带抄写出了程序,但是对于报错,我实在是看不懂呀,求指教啦。
先贴SERVER.PY
- #coding=utf-8
- from xmlrpclib import ServerProxy,Fault
- from os.path import join, abspath,isfile
- from SimpleXMLRPCServer import SimpleXMLRPCServer
- from urlparse import urlparse
- import sys
- SimpleXMLRPCServer.allow_reuse_address = 1
- MAX_HISTORY_LENGTH = 6
- UNHANDLED = 100
- ACCESS_DENIED = 200
- class UnhandledQuery(Fault):
- '''
- that's show can't handle the query exception
- '''
- def __init__(self,message="Couldn't handle the query"):
- Fault.__init__(self, UNHANDLED, message)
- class AccessDenied(Fault):
- '''
- when user try to access the forbiden resources raise exception
- '''
- def __init__(self, message="Access denied"):
- Fault.__init__(self, ACCESS_DENIED, message)
- def inside(dir,name):
- '''
- check the dir that user defined is contain the filename the user given
- '''
- dir = abspath(dir)
- name = abspath(name)
- return name.startswith(join(dir,''))
- def getPort(url):
- '''
- get the port num from the url
- '''
- name = urlparse(url)[1]
- parts = name.split(':')
- return int(parts[-1])
- class Node:
- def __init__(self, url, dirname, secret):
- self.url = url
- self.dirname = dirname
- self.secret = secret
- self.known = set()
- def query(self, query, history = []):
- try:
- return self._handle(query)
- except UnhandledQuery:
- history = history + [self.url]
- if len(history) > MAX_HISTORY_LENGTH: raise
- return self._broadcast(query,history)
- def hello(self,other):
- self.known.add(other)
- return 0
- def fetch(self, query, secret):
- if secret != self.secret: raise
- result = self.query(query)
- f = open(join(self.dirname, query),'w')
- f.write(result)
- f.close()
- return 0
- def _start(self):
- s = SimpleXMLRPCServer(("",getPort(self.url)),logRequests=False)
- s.register_instance(self)
- s.serve_forever()
- def _handle(self, query):
- dir = self.dirname
- name = join(dir, query)
- if not isfile(name):raise UnhandledQuery
- if not inside(dir,name):raise AccessDenied
- return open(name).read()
- def _broadcast(self, query, history):
- for other in self.known.copy():
- if other in history: continue
- try:
- s = ServerProxy(other)
- return s.query(query, history)
- except Fault, f:
- if f.faultCode == UNHANDLED:pass
- else: self.known.remove(other)
- except:
- self.known.remove(other)
- raise UnhandledQuery
- def main():
- url, directory, secret = sys.argv[1:]
- n = Node(url,directory,secret)
- n._start()
- if __name__ == '__main__': main()
复制代码
再是client。py
- #coding=utf-8
- from xmlrpclib import ServerProxy, Fault
- from cmd import Cmd
- from random import choice
- from string import lowercase
- from server import Node,UNHANDLED #引入前面的server
- from threading import Thread
- from time import sleep
- import sys
- HEAD_START = 0.1
- SECRET_LENGTH = 100
- def randomString(length):
- chars = []
- letters = lowercase[:26]
- while length > 0:
- length -= 1
- chars.append(choice(letters))
- return ''.join(chars)
- class Client(Cmd):
- prompt = '> '
- def __init__(self, url, dirname, urlfile):
- Cmd.__init__(self)
- self.se<span style="line-height: 1.5;">cret = randomString(SECRET_LENGTH)</span>
复制代码
最后就是凄惨的报错
求帮助,感激感激!
|
|