#
-*- 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
--
# 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
--
--