#coding=gbk
from tkinter import *
from tkinter.ttk import *
importsocketimportthreadingimportosimportstructimportpickleimportthreading#使用户图形界面和服务器退出循环变量
SERV_RUN_FLAG=TRUE
flag_lock=threading.Lock()#建立一个默认的备份目录
BAK_PATH=r'e:\bak'
#根据指定长度来接受文件信息
defrecv_unit_data(clnt,infos_len):
data=b'' #原来文件为空
#如果要接受的文件在0-1024之间就直接接收该文件,如果大于1024需要循环分段接收,每次只是接收1024个字节,剩下的在全部接收即可
if 0
else:#长度太长
whileTrue:if infos_len >1024:
data+=clnt.recv(1024)
infos_len-=1024
else:
data+=clnt.recv(infos_len)break
returndatadefget_files_info(clnt):
fmt_str='Q?'#用于向服务器端传送文件信息的大小,文件信息的压缩选项
headsize=struct.calcsize(fmt_str)#计算长度
data=clnt.recv(headsize)
infos_len,compress=struct.unpack(fmt_str, data)
data=recv_unit_data(clnt, infos_len)return pickle.loads(data),compress#得到文件信息的列表
def mk_math(filepath): #建立文件路径
paths=filepath.split(os.path.sep)[:-1]#将文件路径进行分割
p=BAK_PATHfor path in paths:#遍历用户端传来的路径
p=os.path.join(p,path)#将保存的路径添加到默认的路径上
if not os.path.exists(p):#如果路径不存在就建立路径
os.mkdir(p)defget_compress_size(clnt):
fmt_str= 'Q'#长整型
size=struct.calcsize(fmt_str)
data=clnt.recv(size)
size,=struct.unpack(fmt_str,data)#得到压缩后文件的大小
returnsize#接收客户端传来文件,并且根据文件信息来进行保存备份
defrecv_file(clnt,infos_len,filepath,compress):
mk_math(filepath)#遍历文件 通过路径
filepath = os.path.join(BAK_PATH,filepath)#服务器上的路径的文件名
#根据压缩选项判断
ifcompress :
infos_len= get_compress_size(clnt)#压缩后文件的长度
filepath = ''.join(os.path.splitext(filepath)[0],'.tar.gz')
f= open(filepath,'wb+')#新建一个文件
#接收文件
try:if 0 < infos_len <=1024:
data=clnt.recv(infos_len)
f.write(data)else:whileTrue:if infos_len >1024:
data=clnt.recv(1024)
f.write(data)
infos_len-=1024
else:
data=c