Socket上传下载

Client 客户端

import json, struct
from socket import *

# 创建对象
client = socket(AF_INET, SOCK_STREAM)
# 建立连接
client.connect(("192.168.11.78", 8080))

# 开始收发文件
while True:
    print("我是客户端,我已开机,感觉良好!")
    file_path = input("请输入你要上传的文件路径:").strip()
    if len(file_path) == 0: continue


    def get_header(file_path):
        # 一点点获取上传文件大小
        with open(r"%s" % file_path, "rb")as f:
            data = f.read()
            size = len(data)

        # 制作上传文件报头的字典
        upload_dic = {
            "name": file_path.split('\\')[-1],
            "size": size,
            "md5": "阿巴阿巴阿巴"
        }
        # print(upload_dic)
        # 将字典用json序列化
        upload_json = json.dumps(upload_dic)
        # 将json文件转成bytes格式
        upload_bytes = upload_json.encode("utf8")
        header = upload_bytes
        return header, data


    header, data = get_header(file_path)
    # print(data)
    # print(len(header))  # 报头长度
    # 开始发送报头
    client.send(header)  # 这里直接发送报头长度  避免服务端解包再接收报头再收数据
    # 开始发送真实文件
    # while send_  < size:
    client.send(data)
    print("Over!")

# C:\Users\S\Pictures\ScreenCapture\blue.jpg

Server服务端

import json, struct
from socket import *

# 创建客户端
server = socket(AF_INET, SOCK_STREAM)

# 绑定地址
server.bind(("127.0.0.1", 8080))

# 准备接客
server.listen(5)

# 开始回环
while True:
    print("我是服务器,我已开机,感觉良好!")
    common, address = server.accept()
    while True:
        try:
            # 准备接收 报文头
            message = common.recv(82)  # 长度从客户端获取 也可以接收pack
            if len(message) == 0: break
            # 将byte文件转为json文件
            header_json = message.decode("utf8")
            # json文件反序列化为字典
            header_dic = json.loads(header_json)
            # print(header_dic)
            # 好了现在我们可以取值了
            name = header_dic["name"]
            size = header_dic["size"]
            md5 = header_dic["md5"]

            # 接收真实文件
            data = common.recv(size)  # 定义接收文件大小
            # print(data)
            with open(r"C:\Users\S\Desktop\%s" % name, mode="wb")as f:
                f.write(data)

        except Exception:
            break

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值