# -*- coding: utf-8 -*-
#Give wisdom to the machine,By ChangShouMeng\
#定义传输的上下文,client与server通用的上下文
import time
import os,sys,traceback
class FileTransferContext(object):
TRANSFER_TYPE_SEND=0
TRANSFER_TYPE_RECV=1
def __init__(self):
self.transferType=0
self.filePath = "" # absolute path,send
self.fileTotalSize = 0
self.fileChunkSize=1024
self.contextName="-"
self.fileBaseName=""#only filename,recv
self.fileHandle = None
self.transferedSize=0
self.transferMsgId = 0
self.transferSeqNum = 0
self.transferSeqNumUpLimit = 0
self.transferSeqChunkSize = 10
self.transferBeginTime = 0
self.tmpdir="temp"
self.workStatus=0
def __del__(self):
self.finiTransInfo()
def initTransferInfo(self):
print "---begin----init transfer info"
try:
if self.transferType== FileTransferContext.TRANSFER_TYPE_SEND:
self.contextName="snd>>"
self.fileTotalSize = os.path.getsize(self.filePath)
self.fileBaseName = os.path.basename(self.filePath)
self.fileHandle=open(self.filePath,'rb')
else:
self.contextName="rcv<<"
tmp_fn = r"{0}/{1}_tmp".format(self.tmpdir, self.fileBaseName)
self.fileHandle=open(tmp_fn,'wb')
print tmp_fn
assert self.fileHandle
self.transferBeginTime= (int)(time.time())
self.transferedSize=0
self.transferSeqNumUpLimit=self.fileTotalSize/self.fileChunkSize + 1
self.workStatus=1
print "initTransferInfo {0} fileName:{1} fileSize:{2}".format(self.contextName,self.fileBaseName,self.fileTotalSize)
return True
except:
print "initTransferinfo failed:",traceback.print_exc()
print "init filepath is:",self.filePath
return False
def finiTransInfo(self):
if not self.fileHandle:
return
try:
if self.transferType == FileTransferContext.TRANSFER_TYPE_RECV:
self.fileHandle.flush()
self.fileHandle.close()
self.fileHandle=None
except:
print "finiTransInfo failed:", traceback.print_exc()
def traceTransferInfo(self):
if self.transferedSize == self.fileTotalSize:
self.workStatus=2
if self.transferSeqNum > 5 and (self.transferSeqNum % self.transferSeqChunkSize) != 0:
return
useTime = int(time.time()) - self.transferBeginTime
speed = ""
progress = float(self.transferedSize) / float(self.fileTotalSize)
if useTime > 0:
speedint = float(self.transferedSize) / float(useTime * 1024)
if speedint >= 1024:
speedint= float(speedint)/ float(1024)
speed="{:.2f}mb/s".format(speedint)
else:
speed="{:.2f}kb/s".format(speedint)
pass
print "{0}msgid:{1} total:{2}byte tranfered:{3}byte speed:{4} progress:{5:.2f} use-time:{6}s".format(
self.contextName,
self.transferMsgId,
self.fileTotalSize,
self.transferedSize,
speed,
progress,
useTime)
def readBuffer(self):
try:
return self.fileHandle.read(self.fileChunkSize)
except:
print "readBuffer err:",traceback.print_exc()
return ""
def writeBuffer(self,buffer):
try:
self.fileHandle.write(buffer)
if (self.transferSeqNum % self.transferSeqChunkSize) == 0:
self.fileHandle.flush()
self.transferedSize += len(buffer)
#print self.transferedSize,self.fileTotalSize
if self.transferedSize == self.fileTotalSize:
self.fileHandle.flush()
self.fileHandle.close()
self.fileHandle=None
tmp_fn = "{0}/{1}_tmp".format(self.tmpdir, self.fileBaseName)
real_fn = "{0}/{1}".format(self.tmpdir, self.fileBaseName)
print "-"*80
print "tmp_fn:",tmp_fn
print "real_fn:",real_fn
if os.path.exists(real_fn):
os.remove(real_fn)
os.rename(tmp_fn,real_fn)
self.workStatus=2
except:
print "writeBuffer err:",traceback.print_exc()
return
def isFinished(self):
if self.workStatus <= 1:
return False
return True
--
代码下载: https://github.com/changshoumeng/python_local-network_file-transfer-service
--
--