PYTHON书写的点对点文件传送,支持断点续传,python文件传送,Recv.py#!/us
PYTHON书写的点对点文件传送,支持断点续传,python文件传送,Recv.py#!/us
Recv.py
#!/usr/bin/python2.7# -*- coding:=utf-8 -*-import socketimport osimport structimport selectimport mathimport ConfigParser,stringfrom optparse import OptionParserfrom summd5 import summd5import sys reload(sys)c=sys.getdefaultencoding()sys.setdefaultencoding('utf-8') FileHead=''FileName=''FileSize=0BUFSIZE=0MD5Name=''MD5Size=''Rerecv=0FLAG=0def GetArg(): p=OptionParser() p.add_option('-d',dest='ConfDir',help="the path of the config file:/*/*/*") options,args=p.parse_args() if not os.path.exists(options.ConfDir): print 'the file not exists' print "the path of the config file:/*/*/*" exit() else: ConfDir=options.ConfDir return ConfDirdef ReadConf(ConfDir): Addr=() cf = ConfigParser.ConfigParser() cf.read(ConfDir) ser_hostname = cf.get("SER", 'HOSTNAME') ser_port= cf.get("SER", "PORT") Addr=(ser_hostname,int(ser_port)) return Addrdef RecvHead(conn): global FileHead,BUFSIZE,FileSize,FileName FileHead=conn.recv(1024) s=FileHead.split("/") FileName=s[0].decode('gb2312') FileSize=int(s[1]) BUFSIZE=int(s[2]) print FileName,FileSize,BUFSIZEdef Conversation(conn): global Rerecv,MD5Name,FileName MD5Name='MD5_'+FileName+'.txt' Size=struct.calcsize('1i') if os.path.isfile(MD5Name): Rerecv=1 print "This is Resend" Head=struct.pack('1i',Rerecv) conn.send(Head)def Prog(RestSize): global FileSize RecvSize=FileSize-RestSize try: a=int(RecvSize*100/float(FileSize)) except ZeroDivisionError: a=0 sys.stdout.write('----------------------------------Received:'+str(a)+'%'+"\r") sys.stdout.flush()def FileRecv(conn,RecvSocket,RestSize): global BUFSIZE,FLAG try: conn.settimeout(1) if RestSize>(BUFSIZE+32): Rest=BUFSIZE+32 else: Rest=RestSize+32 c=0 while Rest!=0: s=conn.recv(Rest) if c==0: FileData=s else: FileData=FileData+s Rest=Rest-len(s) c=c+1 except socket.timeout: print "timeout" FLAG=1 return FileDatadef FirstRecv(conn,RecvSocket): global MD5Name,BUFSIZE,FileName,FileSize fp=open(FileName,'w') RestSize=FileSize FLAG=0 BLOCK=1 i=0 fm=open(MD5Name,'w') fp.close() fm.write(str(BUFSIZE)+'/') fm.close() while 1: fm=open(MD5Name,'ab') fp=open(FileName,'ab') infds,outfds,errfds=select.select([conn,],[],[],1) if len(infds)==0: print "waittime out........" FLAG=1 break try: FileData=FileRecv(conn,RecvSocket,RestSize) except KeyboardInterrupt: FLAG=1 break w=len(FileData) if not FileData or w<32: print RestSize print FileData break RMD5Data=FileData[-32:-1]+FileData[-1] FileData=FileData[0:w-32] LMD5Data=summd5(FileData) if cmp(LMD5Data,RMD5Data) or (not RMD5Data): String='0:'+LMD5Data+'*' fm.write(String) else: String=str(BLOCK)+':'+LMD5Data+'*' fp.write(FileData) fm.write(String) RestSize=RestSize-len(FileData) if RestSize==0: break i=i+1 BLOCK=BLOCK+1 Prog(RestSize) fm.close() fp.close() fp.close() fm.close() conn.close() RecvSocket.shutdown(socket.SHUT_RD) RecvSocket.close() if FLAG==1 or RestSize!=0: print "receive fail!!!" else: print "Finished " os.remove(MD5Name)def RerecvHead(conn): global MD5Name,FileName ReFileHead=struct.pack('2i',os.stat(MD5Name).st_size,os.stat(FileName).st_size) conn.send(ReFileHead) fm=open(MD5Name,'rb') while 1: MD5Data=fm.read(1024) if not MD5Data: break conn.send(MD5Data) fm.close()def ConRecv(conn,RecvSocket): global FileName,FileSize,BUFSIZE,MD5Name TemFileName='TEM_'+FileName TemMD5Name='TEM_'+MD5Name fm=open(MD5Name,'rb') fp=open(FileName,'rb') ft=open(TemFileName,'w') c=fm.read() c=c.split('/') MD5Data=c[1] BUFSIZE=int(c[0]) fm.seek(0) ftm=open(TemMD5Name,'w') ftm.write(str(BUFSIZE)+'/') MD5Data=MD5Data.split("*") if not MD5Data[-1]: del MD5Data[-1] try: MD5Data[-1].split(':') except ValueError: del MD5Data[-1] END=len(MD5Data) i=0 ic=0 RestSize=FileSize-os.stat(FileName).st_size FLAG=0 while(1): Prog(RestSize) infds,outfds,errfds=select.select([conn,],[],[],1) if len(infds)==0: print "waittime out........" FLAG=1 break if i<END: CData=MD5Data[i].split(':') BLOCK=CData[0] else: BLOCK='0' if BLOCK!='0': ft.write(fp.read(BUFSIZE)) ftm.write(MD5Data[i]+'*') else: try: FileData=FileRecv(conn,RecvSocket,RestSize) except KeyboardInterrupt: FLAG=1 break w=len(FileData) ic=ic+1 if not FileData or w<32: print "no data" break RMD5Data=FileData[-32:-1]+FileData[-1] FileData=FileData[0:w-32] LMD5Data=summd5(FileData) if cmp(LMD5Data,RMD5Data) or (not RMD5Data): String='0:'+LMD5Data+'*' else: ft.write(FileData) String=str(BLOCK)+':'+LMD5Data+'*' ftm.write(String) RestSize=RestSize-len(FileData) if RestSize<=0: print RestSize print "restsize==0" break i=i+1 if RestSize>0: s=fp.read() ft.write(s) while i<len(MD5Data): ftm.write(MD5Data[i]) i=i+1 ftm.close() fp.close() fm.close() ft.close() conn.close() os.remove(FileName) os.remove(MD5Name) os.rename(TemFileName,FileName) os.rename(TemMD5Name,MD5Name) RecvSocket.shutdown(socket.SHUT_RD) RecvSocket.close() if FLAG==1 or RestSize!=0: print "receive fail!!!" else: print "Finished " os.remove(MD5Name)def Recv(ConfDir): Addr=() Addr=ReadConf(ConfDir) RecvSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) RecvSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) RecvSocket.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,8888888) RecvSocket.bind(Addr) RecvSocket.listen(5) print "waiting..................." conn,addr=RecvSocket.accept() print "send from:",addr RecvHead(conn) Conversation(conn) if Rerecv==0: FirstRecv(conn,RecvSocket) else: RerecvHead(conn) ConRecv(conn,RecvSocket)if __name__=='__main__': ConfDir=GetArg() Recv(ConfDir)
summd5.py
#!/usr/bin/python2.7#use:summd5 of filesfrom md5 import md5def summd5(Data): s=md5() s.update(Data) return s.hexdigest()
summd5.py
#!/usr/bin/python2.7#use:summd5 of filesfrom md5 import md5def summd5(Data): s=md5() s.update(Data) return s.hexdigest()
相关内容
- “愤怒”离开百度空间(增加图片抓取功能),百度抓取
- Base62,,[Python]代码#f
- ASCII转换成十六进制,ascii转换十六进制,[Python]代码#!
- 自杀脚本,,[Python]代码im
- 清空当前目录下,除本脚本文件的所有文本文件(点文件
- Pymssql学习,对依时利一卡通考勤记录的修改,pymssql一
- 很蛋疼的python3快盘签到,哈哈,蛋疼python3签到,很蛋疼
- 给出目录下包括子目录所有文件的绝对路径,目录绝对
- django 返回request.META所有数据,djangorequest.meta,index.html
- django 简单显示数据库的内容,django数据库内容,views.p
评论关闭