前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day32 - sturct功能的使用,实现一个文件下载或上传

day32 - sturct功能的使用,实现一个文件下载或上传

原创
作者头像
少年包青菜
修改2020-12-14 11:44:05
3310
修改2020-12-14 11:44:05
举报
文章被收录于专栏:Python 学习Python 学习

server端.py

# 获取二进制字典报头

# 获取二进制字典长度

# 将二进制字典的长度生成一个固定4字节长度的bytes

# 发给另一端 # 另一端固定 recv(4),再 unpack,得到二进制字典长度

# recv(二进制字典长度),得到二进制字典

代码语言:javascript
复制
import struct
import json
import socket

socket_obj = socket.socket()
socket_obj.bind(('localhost', 8000))
socket_obj.listen(1024)
connection, address = socket_obj.accept()

# 先固定接收4字节
struct_from_client = connection.recv(4)
# 解包得到二进制字典长度
bytes_len = struct.unpack('i', struct_from_client)[0]
# 根据长度接收二进制字典
dic_str = connection.recv(bytes_len).decode('utf8')
dic_header = json.loads(dic_str)

# 二进制追加写入的方式
with open(dic_header['filename'], 'ab') as f:
    file_size = dic_header['file_size']
    buffer_len = dic_header['buffer_len']
    while file_size:
        if file_size < buffer_len:
            data_from_client = connection.recv(file_size)
            f.write(data_from_client)
            break
        data_from_client = connection.recv(buffer_len)
        f.write(data_from_client)
        file_size -= buffer_len

connection.close()
socket_obj.close()

client端.py

# 先固定接收4字节 # 解包得到二进制字典长度 # 根据长度接收二进制字典

代码语言:javascript
复制
import struct
import json
import socket
import os

socket_obj = socket.socket()
socket_obj.connect(('localhost', 8000))
dic_header = {
    'filename': 'linux.mp4',
    'file_dir': r'D:/',
    'file_size': '',
    'buffer_len': 256   # 每次接收多少字节
}

file_path = os.path.join(dic_header['file_dir'], dic_header['filename'])
# 文件大小
file_size = os.path.getsize(file_path)
dic_header['file_size'] = file_size
dic_json = json.dumps(dic_header)
# 获取二进制字典
dic_bytes = bytes(dic_json, encoding='utf8')
# 获取二进制字典长度
dic_len = len(dic_bytes)
# 将二进制字典的长度生成一个固定4字节长度的bytes
struct_to_server = struct.pack('i', dic_len)
# 发给另一端
# 另一端固定 recv(4),再 unpack,得到二进制字典长度
socket_obj.send(struct_to_server)
# 另一端 recv(二进制字典长度),将获得 bytes 字典
socket_obj.send(dic_bytes)

with open(file_path, 'rb') as f:
    buffer_len = dic_header['buffer_len']
    while file_size:
        if file_size < buffer_len:
            data_to_server = f.read(file_size)
            socket_obj.send(data_to_server)
            break
        data_to_server = f.read(buffer_len)
        socket_obj.send(data_to_server)
        file_size -= buffer_len

socket_obj.close()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • server端.py
  • client端.py
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档