python怎么发送文件,python文件上传
python中传输文件的方法:1。把头转换成字符串[json.dumps],然后把字符串的长度打包;2.发送头长度和头内容,然后播放真实内容;3.解压缩头长度以获得头信息的大小,然后接收头信息并将其反序列化。
思维:
#先把头转换成字符串(json.dumps),然后把字符串的长度打包。
#发送头长度,发送头内容,最后放真实内容。
#头内容包括文件名、文件信息和头。
#接收时,首先接收长度为4字节的报头,
#解压缩标题长度以获得标题信息的大小。收到头信息后,反序列化它(json.loads)
#终于收到真正的文件
服务端
#!/usr/bin/envpython
#-*-编码:utf-8-*-
#@File:文件传输-server.py
# @ software : pycharmfromsocketimport * importstructimportjsonimportosttcp _ server=socket(AF _ INET,SOCK _ STREAM)IP _ port=(( 127 . 0 . 0 . 1 ,8080))buffsize=1024
#端口的重复使用
TCP _ server . setsockopt(sol _ socket,so _ reuseport,1)TCP _ server . bind(IP _ port)TCP _ server . listen(5)print(还没有人链接)
whileTrue:
链接循环
conn,addr=tcp_server.accept()
打印(“链接者信息3360”,地址)
whileTrue:
ifnotconn:
打印(“客户端链接断开”)
breakn
bsp;
'''通信循环'''
filemesg=input('请输入要传送的文件名加后缀>>>').strip()
filesize_bytes=os.path.getsize(filemesg)#得到文件的大小,字节
filename='new'+filemesg
dirc={
'filename':filename,
'filesize_bytes':filesize_bytes,
}
head_info=json.dumps(dirc)#将字典转换成字符串
head_info_len=struct.pack('i',len(head_info))
#将字符串的长度打包
#先将报头转换成字符串(json.dumps),再将字符串的长度打包
#发送报头长度,发送报头内容,最后放真是内容
#报头内容包括文件名,文件信息,报头
#接收时:先接收4个字节的报头长度,
#将报头长度解压,得到头部信息的大小,在接收头部信息,反序列化(json.loads)
#最后接收真实文件
conn.send(head_info_len)#发送head_info的长度
conn.send(head_info.encode('utf-8'))
#发送真是信息
withopen(filemesg,'rb')asf:
data=f.read()
conn.sendall(data)
print('发送成功')客户端
#!/usr/bin/envpython进度条#-*-coding:utf-8-*-
#@File:文件传输_客户端.py
#@Software:PyCharmfromsocketimport*
importstruct
importjson
importos
importsys
importtime
from进度条importprocess_bar
tcp_client=socket(AF_INET,SOCK_STREAM)
ip_port=(('127.0.0.1',8080))
buffsize=1024
tcp_client.connect_ex(ip_port)
print('等待链接服务端')
whileTrue:
head_struct=tcp_client.recv(4)#接收报头的长度,
ifhead_struct:
print('已连接服务端,等待接收数据')
head_len=struct.unpack('i',head_struct)[0]#解析出报头的字符串大小
data=tcp_client.recv(head_len)#接收长度为head_len的报头内容的信息(包含文件大小,文件名的内容)
head_dir=json.loads(data.decode('utf-8'))
filesize_b=head_dir['filesize_bytes']
filename=head_dir['filename']
#接受真的文件内容
recv_len=0
recv_mesg=b''
old=time.time()
f=open(filename,'wb')
whilerecv_len<filesize_b:
percent=recv_len/filesize_b
process_bar(percent)
iffilesize_b-recv_len>buffsize:
recv_mesg=tcp_client.recv(buffsize)
f.write(recv_mesg)
recv_len+=len(recv_mesg)
else:
recv_mesg=tcp_client.recv(filesize_b-recv_len)
recv_len+=len(recv_mesg)
f.write(recv_mesg)
print(recv_len,filesize_b)
now=time.time()
stamp=int(now-old)
print('总共用时%ds'%stamp)
f.close()
#!/usr/bin/envpython#-*-coding:utf-8-*-
#@File:进度条.py
#@Software:PyCharm
importsys
importtime
defprocess_bar(precent,width=50):use_num=int(precent*width)space_num=int(width-use_num)precent=precent*100
#第一个和最后一个一样梯形显示,中间两个正确,但是在python2中报错#print('[%s%s]%d%%'%(use_num*'#',space_num*'',precent))#print('[%s%s]%d%%'%(use_num*'#',space_num*'',precent),end='\r')print('[%s%s]%d%%'%(use_num*'#',space_num*'',precent),file=sys.stdout,flush=True,end='\r')
#print('[%s%s]%d%%'%(use_num*'#',space_num*'',precent),file=sys.stdout,flush=True)
#foriinrange(21):
#precent=i/20
#process_bar(precent)
#time.sleep(0.2)
推荐课程:Python进阶视频教程
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。