• 基于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()
    

      

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

  • 相关阅读:
    二进制,八进制,十进制,十六进制之间的转换
    Ajax
    JSP
    事务
    BDUtils
    LG. 1003 铺地毯
    Educational Codeforces Round 25
    POJ.3268 Silver Cow Party (Dijkstra)
    POJ.1797 Heavy Transportation (Dijkstra变形)
    POJ. 2253 Frogger (Dijkstra )
  • 原文地址:https://www.cnblogs.com/mofujin/p/10850844.html
Copyright © 2020-2023  润新知