模拟百度网盘中文件的上传与下载

本文详细介绍了一种基于Socket的文件上传和下载实现方案,包括server端和client端的代码示例,展示了如何通过Socket进行文件大小的传输、接收及处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 实现一个文件的上传或下载     server端
# 配置文件 ip地址 端口
import socket
import struct
import json
sk = socket.socket()
sk.bind(("127.0.0.1", 8090))
sk.listen()

buffer = 1024
conn, addr = sk.accept()
# 接收
head_length = conn.recv(4)
head_length = struct.unpack("i", head_length)[0]
json_head = conn.recv(head_length).decode("utf-8")
head = json.loads(json_head)   # 字典head
file_size = head["filesize"]
with open("music", "wb") as f:
    while file_size:
        if file_size >= buffer:
            content = conn.recv(buffer)
            f.write(content)
            file_size -= buffer
        else:
            content = conn.recv(file_size)
            f.write(content)
            break
conn.close()
sk.close()





# 发送端(client)
import socket
import os
import json
import struct
sk = socket.socket()
sk.connect(("127.0.0.1", 8090))
buffer = 1024
# 发送文件
head = {"filepath": r"C:\Users\26651\Music", "filename": r"朱七 - 夏天已过去.mp3", "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)   # 从字典转成字符串
byte_head = json_head.encode("utf-8")   # 从字符串转字节
head_length = struct.pack("i", len(byte_head))   # 将报头的长度转化四个字节
sk.send(head_length)
sk.send(byte_head)
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()

 

转载于:https://www.cnblogs.com/nxrs/p/10481919.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值