85-python- struct模块 (文件上传)
server -- 接收端
# 接收端
import socket
import struct
import json
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
buffer = 1024
conn,addr = sk.accept()
head_len = conn.recv(4) # 接收第一次传输(必定为4)
head_len = struct.unpack('i',head_len)[0] # 拿到文件带大小
json_head = conn.recv(head_len).decode('utf-8') # 拿到报头(head)
head = json.load(json_head)
filesize = head['filesize']
with open(head['filename'],'wb') as f:
while filesize:
if filesize >= buffer:
content = conn.recv(buffer)
f.write(content)
filesize -= buffer
else:
content = conn.recv(filesize)
f.write(content)
break
conn.close()
sk.close()
client -- 发送端
# 发送端
import socket
import json
import struct
import os
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
buffer = 1024 # 每一次缓存大小 (读取的大小)
head = {'filepath':r'D:\视频\day32','filename':'04 python fullstack s9day32 struct模块补充.mp4','filesize':None} # 设置 报头
file_path = os.path.join(head['filepath'],head['filename']) # 获取文件的路劲
file_size = os.path.getsize(file_path) # 获取文件的大小
head['filesize'] = file_size # 设置报文的 文件大小
json_head = json.dumps(head) # 字典转换字符串
bytes_head = json_head.encode('utf-8') # 字符串转换bytes
head_len = len(bytes_head) # 报头的长度(head)
pack_len = struct.pack('i',head_len)
sk.send(pack_len) # 发送报头的长度
sk.send(bytes_head) # 再发送 bytes 类型的报头
with open(file_path,'rb') as f:
while file_size:
if file_size >= buffer:
content = f.read(buffer)
sk.send(content)
file_size -= buffer
else:
content = f.read(file_size)
sk.send(content)
break
sk.close()

浙公网安备 33010602011771号