Contents
p2p 试开发
最近,用python编了一个p2p文件共享系统,是在windows下的 源代码如下:
>>> import sys,os,os.path,xml.dom.minidom >>> import struct,socket,threading,Queue >>> #获取本地共享文件列表 >>> def LocalFileList(): #共享当前工作目录下的文件 cwdlist=os.listdir(os.getcwd()) cwdfilelist=[] for afile in cwdlist: #判断是文件还是目录 if os.path.isfile(afile): cwdfilelist.append(afile) else: continue return(cwdfilelist,os.getcwd()) >>> #生成共享文件XML文档 >>> def GenFileXML(cwdfilelist,cwdir): XMLFileName='SharedFile.xml' if os.path.isfile(XMLFileName): os.remove(XMLFileName) xmlfile=open(XMLFileName,'w') fileid=1 filestr='' #对于简单的XML文档可以使用输出重定向来生成 print>>xmlfile,'<FileList>' for afile in cwdfilelist: filestr='<File FileID="'+str(fileid) +'"FileName="'+afile +'"FileDir="'+cwdir+'"/>' print>>xmlfile,filestr fileid=fileid+1 print>>xmlfile,'</FileList>' xmlfile.close() >>> #解析XML文档 >>> def ParsFileXML(xmlfile): RFileDict={} fh=open(xmlfile,'r') doc=xml.dom.minidom.parse(fh) FileTagList=doc.getElementsByTagName("File") for aFileTag in FileTagList: FileID=aFileTag.getAttribute('FileID') FileName=aFileTag.getAttribute('FileName') RFileDict[int(FileID)]=FileName fh.close() return RFileDict >>> #命令监听线程 >>> def cmdListenThread(queue): #监听端口12007 cmdport=12007 #计算一条命令的长度 CMD_SIZE=struct.calcsize('cI') cmdsock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) cmdsock.bind(('',cmdport)) while(True): cmdsock.listen(1) conn,addr=cmdsock.accept() data=conn.recv(CMD_SIZE) #解析命令包 cmdhead,cmdtail=struct.unpack('cI',data) conn.close() #'r'是请求连接命令 if cmdhead=='r': #发共享文件列表 senddata(addr,'SharedFile.xml') #'d'是下载文件命令 elif cmdhead=='d': RFileDict={} RFileDict=ParsFileXML('SharedFile.xml') keys=RFileDict.keys() for key in keys: if int(key)==cmdtail: senddata(addr,RFileDict[key]) else: continue >>> #文件监听线程 >>> def fileListenThread(queue): #监听端口是12008 fileport=12008 #用于判断发送的是文件信息还是文件内容 IS_FILEINFO=1 #计算文件信息包的大小 FILEINFO_SIZE=struct.calcsize('128s32sI8s') #接收文件时,每次读取1KB blksz=1024 filename,filesize='',0 #已经接收的文件大小 recved=0 filesock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) filesock.bind(('',fileport)) while(True): filesock.listen(1) conn,addr=filesock.accept() while(True): #接收文件信息 if(IS_FILEINFO==1): data=conn.recv(FILEINFO_SIZE) #解析文件信息包 filename,temp1,filesize,temp2=struct.unpack ('128s32sI8s',data) filename=filename.strip('\00') if filename=='SharedFile.xml': filename='RSharedFile.xml' IS_FILEINFO=0 else: file=open("./"+filename,'web') while(True): remainf=filesize-recved if remainf>=blksz: data=conn.recv(blksz) file.write(data) recved=recved+len(data) elif remainf<blksz: data=conn.recv(remainf) file.write(data) recved=recved+len(data) if recved==filesize: break IS_FILEINFO=2 recved=0 file.close() filename="" if IS_FILEINFO==2: IS_FILEINFO=1 break IS_FILEINFO=1 filename,filesize='',0 recved=0 conn.close() >>> #发送命令 >>> def sendcmd(ip,cmdtype,cmdarg): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((ip,12007)) if cmdtype=='connect': cmdpkt=struct.pack('cI','r',0) s.send(cmdpkt) elif cmdtype=='down': cmdpkt=struct.pack('cI','d',int(cmdarg)) s.send(cmdpkt) s.close() >>> #发送文件 >>> def senddata(ip,filename): FILEINFO_SIZE=struct.calcsize('128s32sI18s') blksz=1024 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((ip,12008)) fp='./'+filename fs=os.stat(fp) fhead=struct.pack('128s11I',f,0,0,0,0,0,0,0,0,fs.st_size,0,0) s.send(fhead) fd=open(fp,'rb') while 1: bytes=fd.read(blksz) if not bytes:break sent=s.send(bytes) assert sent==len(bytes) fd.close() s.close() >>> queue=Queue.Queue(0) >>> tcmdlisten=threading.Thread(target=cmdListenThread,args=(queue,)) >>> tcmdlisten.setDaemon(True) >>> tcmdlisten.start() >>> tfilelisten=threading.Thread(target=fileListenThread,args=(queue,)) >>> tfilelisten.setDaemon(True) >>> tfilelisten.start() >>> cwdfilelist,cwdir=LocalFileList() >>> GenFileXML(cwdfilelist,cwdir) >>> while(True): commandstr=raw_input('p2p File Transport?') if commandstr=='help': print 'This a simple p2p fileshare program in python.' elif commandstr=='exit': print 'Exit the program' break elif commandstr=='Islocal': print 'Local shared file:' for afile in cwdfilelist: print afile elif(commandstr.find('connect')!=-1): RemoteIP=commandstr.split('')[1] sendcmd(RemoteIP,'connect',0) elif(commandstr.find('down')!=-1): dfileid=commandstr.split('')[1] sendcmd(RemoteIP,'connect',int(dfileid)) elif commandstr=='Isremote': print 'Remote shared file:' RFileDict={} RFileDict=ParsFileXML() keys=RFileDict.keys() for key in keys: print key,':',RFileDict[key] else: print 'unknown command!' print 'please using help command' {{{ 运行后,出错在第一行, {{{ C:\Python26\packbag>minitransport.py File "C:\Python26\packbag\minitransport.py", line 2 >>> import sys,os,os.path,xml.dom.minidom ^ SyntaxError: invalid syntax
这是什么原因,一般是不会出这样的错吧 麻烦各位了,我在网上找了一下原因,说有可能是路径的问题,即把os.path改为os.path.dirname(argv[0]),可是,运行后, 仍然报错,和上面那个一样,这是什么原因?
反馈
创建 by -- ZoomQuiet [2009-04-23 13:47:36]