终端使用命令启动
python client.py urls.txt D:\pythongui http://127.0.0.1:4242
python报错如下
Traceback (most recent call last):
File "D:\Microsoft VS Code\client.py", line 55, in <module>
if __name__ == '__main__':main()
File "D:\Microsoft VS Code\client.py", line 52, in main
client = Client(url,directory,urlfile)
File "D:\Microsoft VS Code\client.py", line 27, in __init__
n = Node(url,dirname,urlfile)
TypeError: Node() takes no arguments
望帮忙解决,谢谢!
源码如下:
自编server库
from xmlrpc.client import ServerProxy,Fault
from os.path import join,abspath,isfile
from xmlrpc.server import SimpleXMLRPCServer
from urllib.parse import urlparse
import sys
SimpleXMLRPCServer.allow_reuse_address = 1
MAX_HISTORY_LENGTH=6
UNHANDLED = 100
ACCESS_DENIED = 200
class UnhandledQuery(Fault):
def __init__(self, message='Couldn\'t handle the query'):
super().__init__(UNHANDLED,message)
class AccessDenied(Fault):
def __init__(self,message='Access denied'):
super().__init__(ACCESS_DENIED,message)
def inside(dir, name):
dir=abspath(dir)
name=abspath(name)
return name.startswith(join(dir,''))
def get_port(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.know = 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 AccessDenied
result=self.query(query)
f=open(join(self.dirname,query),'w')
f.write(result)
f.close()
return 0
def _start(self):
s=SimpleXMLRPCServer(('',get_port(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 isfile(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 as 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()
主程序:
from xmlrpc.client import ServerProxy,Fault
from cmd import Cmd
from random import choice
from string import ascii_lowercase
from server import Node,UNHANDLED
from threading import Thread
from time import sleep
import sys
HEAD_START = 0.1
SECRET_LENGTH = 100
def random_string(length):
chars=[]
letters=ascii_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.secret = random_string(SECRET_LENGTH)
n = Node(url, dirname, self.secret)
t = Thread(target=n._start)
t.daemon(1)
t.start()
sleep(HEAD_START)
self.server = ServerProxy(url)
for line in open(urlfile):
line = line.split()
self.server.hello(line)
def new_method(self, url, dirname, urlfile):
return url,dirname,urlfile
def do_fetch(self,arg):
try:
self.server.fetch(arg,self.secret)
except Fault as f :
if f.faultCode != UNHANDLED :raise
print('Could\'t find the file',arg)
def do_exit(self,arg):
"退出程序"
print()
sys.exit()
do_EOF = do_exit
def main():
urlfile,directory,url = sys.argv[1:]
client = Client(url,directory,urlfile)
client.cmdloop()
if __name__ == '__main__':main()
两边各两个下划线,你的node的init下划线不够数