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()
posted @ 2018-11-06 20:31  _Q  阅读(190)  评论(0)    收藏  举报