python socket thread_Python--socket和threading编程

#coding=gbkfrom tkinter import *from tkinter.ttk import *importsocketimportthreadingimportosimportstructimportpickleimportthreading#使用户图形界面和服务器退出循环变量SERV_RUN_FLAG=TRUEflag_lock=threading.Lock()#建立一个默认...
摘要由CSDN通过智能技术生成

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值