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]

Name Password4deL ;) :( X-( B-)

PageCommentData