|
Size: 8303
Comment: 删除对PageComment2组件的引用
|
← Revision 3 as of 2009-12-25 07:13:46 ⇥
Size: 8303
Comment: converted to 1.6 markup
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 4: | Line 4: |
| [[TableOfContents]] | <<TableOfContents>> |
| Line 6: | Line 6: |
| [[Include(ZPyUGnav)]] | <<Include(ZPyUGnav)>> |
| Line 254: | Line 254: |
| 创建 by -- ZoomQuiet [[[DateTime(2009-04-23T13:47:36Z)]]] | 创建 by -- ZoomQuiet [<<DateTime(2009-04-23T13:47:36Z)>>] |
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]
