zoukankan      html  css  js  c++  java
  • 基于socket实现大文件上传

    import socket

    1.客户端:

     操作流程:

      先拿到文件--->获取文件大小---->创建字典

      1.制作表头

      header  如何得到 他是一个二进制字符串 

      序列化得到 字典字符串 ----》转成二进制字符串---header_bytes》打包 header_len = struct.pack('i' , len(header_bytes)

      2.发送表头 client.send(header)

      3.发送字典

      client.send(header_bytfes)

      4.发送真实信息

      with open('文件路径‘ ,“rb”) as f:

        for line in f :

          client.send(line)

      详情:

    import socket
    import struct
    import json
    import os
    
    # 第一步:
    client = socket.socket()
    # 绑定地址
    client.connect(('127.0.0.1', 8080))
    
    # 文件大小
    file_size = os.path.getsize(r'D:Dataday32大文件上传基于socket 实现大文件上传hashlib.mp4')  # r' ' :表示原义字符串
    print(file_size)
    # 命名
    
    file_name = '性感小姐姐在线发牌.mp4'
    
    # 定义一个字典
    my_dict = {"file_name": file_name,
               "file_size": file_size,
               "msg": '文件含有的信息哈哈自己写的'}
    #  序列化字典
    data_bytes = json.dumps(my_dict).encode('utf-8')  # 目的一会要转成字符串入内存
    print("123345")
    print(data_bytes)
    # 制作报头
    header = struct.pack('i', len(data_bytes))  # 限制文件的大小
    print(header)   # b'xbcx00x00x00'
    # 发送报头
    client.send(header)  # 客户端发送报头信息
    # 发送字典
    client.send(data_bytes)     # 提示以字典的形式接收
    print(data_bytes)
    
    # 开始发送真实信息  客户需要的详细信息 发送到服务端进行处理
    with open('D:Dataday32大文件上传基于socket 实现大文件上传hashlib.mp4', "rb")as f:
        for line in f:
            client.send(line)
    

      

    2.服务端:

      来吧:

      接收报头---header》解析报头 返回字典格式:1.报头得到我的字典长度header = conn.recv(4)  ---->获取 header_len = struct.unpack('i' , header)[0] -----> header_bytes = conn.recv(header_len)

      header_dict= json.lods(header_bytes).decode('utf-8')

      

    import os
    import json
    import socket
    import struct
    
    # 第一步
    
    # IP_PORT = ('127.0.0.1', 8080)
    # 可以写缩写上面的 试试吧
    server = socket.socket()
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    
    while True:
    
        conn, addr = server.accept()  # 等待接收信息
    
        while True:
    
            try:
                # 接收报头
                header = conn.recv(4)
                # 解析报头,获取报头长度
                header_len = struct.unpack('i', header)[0]
                print(header_len)
                # 获取 #b'{"file_name": "\u6027\u611f\u5c0f\u59d0\u59d0\u5728\u7ebf\u53d1\u724c.mp4", "file_size": 205033304, "msg": "\u6587
                header_bytes = conn.recv(header_len)
                print(header_bytes)     # # 二进制的字典的信息
    
                # 反序列化成字典
                header_dic = json.loads(header_bytes.decode('utf-8'))
                # 开始循环接收文件传到本地
                print(header_dic)   # {'file_name': '性感小姐姐在线发牌.mp4', 'file_size': 254031692, 'msg': '注意身体哦'}
                file_name = header_dic.get("file_name")
                file_size = header_dic.get("file_size")
                recv_size = 0
                # print(file_name)    # 性感美女在线发牌.mp4
    
                with open(file_name, "wb")as f:
                    while recv_size < file_size:
                        data = conn.recv(1024)
                        f.write(data)
                        recv_size = recv_size+len(data)
                        # print(len(data))
                        # print(recv_size) #第一次接收的值
                        break
                print(header_dic.get("msg"))    # 字典点.get是他的内置方法
            except ConnectionError:
                break
        conn.close()
    

      

    可以获取文件 获取我们文件的大小(规定传的大小)

  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/mofujin/p/10850844.html
Copyright © 2011-2022 走看看