首页IT科技python传输图片最好的办法(python怎么传送文件)

python传输图片最好的办法(python怎么传送文件)

时间2025-04-28 20:34:42分类IT科技浏览4136
导读:在python中传送文件的方法:1、将报头转换成字符串【json.dumps】, 再将字符串的长度打包;2、发送报头长度和报头内容,然后放真实内容;3、将报头长度解压,得到头部信息的大小,再接收头部信息,反序列化即可...

在python中传送文件的方法:1           、将报头转换成字符串【json.dumps】            , 再将字符串的长度打包;2                  、发送报头长度和报头内容                 ,然后放真实内容;3      、将报头长度解压      ,得到头部信息的大小            ,再接收头部信息                 ,反序列化即可

思路:

# 先将报头转换成字符串(json.dumps), 再将字符串的长度打包

# 发送报头长度,发送报头内容,最后放真实内容

# 报头内容包括文件名,文件信息,报头

# 接收时:先接收4个字节的报头长度,

# 将报头长度解压,得到头部信息的大小,在接收头部信息, 反序列化(json.loads)

# 最后接收真实文件

服务端

#!/usr/bin/envpython #-*-coding:utf-8-*- #@File:文件传输-服务端.py #@Software:PyCharmfromsocketimport*importstructimportjsonimportostcp_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() print(链接人的信息:,addr) whileTrue: ifnotconn: print(客户端链接中断) break 通信循环 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)

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
如何修改网站标题让排名不降反升(10个实用方法帮助你优化网站标题) phpcms 用的是什么模板引擎(phpcms是做什么的)