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

 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/发送端
原文地址:https://www.cnblogs.com/changjiangwei/p/11379265.html