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/发送端