ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 自定义报头 实现大文件传输

2019-08-19 20:04:18  阅读:260  来源: 互联网

标签:head 自定义 buffer 文件传输 len sk filesize 报头


 1 import socket
 2 import json
 3 import struct
 4 
 5 
 6 buffer = 4096
 7 # 每次接收长度
 8 sk = socket.socket()
 9 sk.bind(("127.0.0.1",8080))
10 sk.listen()
11 conn, addr = sk.accept()
12 
13 head_len = conn.recv(4)
14 # 获取包装后的报头长度
15 head_len = struct.unpack("i",head_len)[0]
16 # 解包报头长度
17 json_head = conn.recv(head_len)
18 # 接收报头
19 head = json.loads(json_head)
20 print(head)
21 # 反序列化报头
22 filesize = head["filesize"]
23 # 获取文件大小
24 n_filesize = filesize
25 # 现在剩余未传输文件大小
26 filename = head["filename"]
27 # 获取文件名称
28 with open(filename,"wb") as f:
29     # 打开文件
30     while True:
31         print(str(round(100 - n_filesize/filesize * 100,2)) + "%")
32         # 显示进度
33         if n_filesize >= buffer:
34             # 文件剩余大小大于等于每次传输的大小
35             content = conn.recv(buffer)
36             # 接收buffer长度的数据
37             f.write(content)
38             # 将接收的数据写入
39             n_filesize -= buffer
40             # 文件大小减去本次传输的大小
41         else:
42             # 文件剩余大小不足buffer
43             # 将剩余文件一次性传完
44             content = conn.recv(n_filesize)
45             # 接收剩余文件
46             f.write(content)
47             # 将接收的数据写入文件
48             print("100%")
49             break
50 conn.close()
51 sk.close()
server/接收端
 1 import socket
 2 import struct
 3 import json
 4 import os
 5 
 6 
 7 buffer = 4096
 8 # 每次send发送的大小
 9 sk = socket.socket()
10 sk.connect(("127.0.0.1",8080))
11 
12 head = {"filepath":"F:\工具",
13         "filename":"nox_setup_v6.2.7.1_full.exe",
14         "filesize":None
15         }
16 # 自定义报头
17 filepath = os.path.join(head["filepath"],head["filename"])
18 # 拼接文件路径
19 filesize = os.path.getsize(filepath)
20 head["filesize"] = filesize
21 n_filesize = filesize
22 # 获取文件大小
23 json_head = json.dumps(head).encode("utf8")
24 # 将报头序列化并转码成utf8
25 head_len = len(json_head)
26 # 获取报头文件长度
27 head_len = struct.pack("i",head_len)
28 # 将报头长度包装为四个字节
29 # 参数"i"代表要包装的是数字int类型
30 sk.send(head_len)
31 sk.send(json_head)
32 with open(filepath,"rb") as f:
33     # 打开文件
34     while True:
35         print(str(round(100 - n_filesize/filesize * 100,2)) + "%")
36         # 显示进度
37         if n_filesize >= buffer:
38             # 如果文件还大于buffer,则按buffer大小传输
39             content = f.read(buffer)
40             # 读取buffer大小的内容
41             sk.send(content)
42             # 发送文件
43             n_filesize -= buffer
44             # 文件总大小减去本次发送的大小
45         else:
46             content = f.read(n_filesize)
47             # 读取剩余文件
48             sk.send(content)
49             # 发送剩余文件
50             print("100%")
51             break
52 sk.close()
client/发送端

 

标签:head,自定义,buffer,文件传输,len,sk,filesize,报头
来源: https://www.cnblogs.com/changjiangwei/p/11379265.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有