zoukankan      html  css  js  c++  java
  • python 自定义报头 实现大文件传输

     1 import socket
     2 import json
     3 import struct
     4 
     5 
     6 buffer = 4096
     7 # 每次接收长度
     8 sk = socket.socket()
     9 sk.bind(("127.0.0.1",8080))
    10 sk.listen()
    11 conn, addr = sk.accept()
    12 
    13 head_len = conn.recv(4)
    14 # 获取包装后的报头长度
    15 head_len = struct.unpack("i",head_len)[0]
    16 # 解包报头长度
    17 json_head = conn.recv(head_len)
    18 # 接收报头
    19 head = json.loads(json_head)
    20 print(head)
    21 # 反序列化报头
    22 filesize = head["filesize"]
    23 # 获取文件大小
    24 n_filesize = filesize
    25 # 现在剩余未传输文件大小
    26 filename = head["filename"]
    27 # 获取文件名称
    28 with open(filename,"wb") as f:
    29     # 打开文件
    30     while True:
    31         print(str(round(100 - n_filesize/filesize * 100,2)) + "%")
    32         # 显示进度
    33         if n_filesize >= buffer:
    34             # 文件剩余大小大于等于每次传输的大小
    35             content = conn.recv(buffer)
    36             # 接收buffer长度的数据
    37             f.write(content)
    38             # 将接收的数据写入
    39             n_filesize -= buffer
    40             # 文件大小减去本次传输的大小
    41         else:
    42             # 文件剩余大小不足buffer
    43             # 将剩余文件一次性传完
    44             content = conn.recv(n_filesize)
    45             # 接收剩余文件
    46             f.write(content)
    47             # 将接收的数据写入文件
    48             print("100%")
    49             break
    50 conn.close()
    51 sk.close()
    server/接收端
     1 import socket
     2 import struct
     3 import json
     4 import os
     5 
     6 
     7 buffer = 4096
     8 # 每次send发送的大小
     9 sk = socket.socket()
    10 sk.connect(("127.0.0.1",8080))
    11 
    12 head = {"filepath":"F:工具",
    13         "filename":"nox_setup_v6.2.7.1_full.exe",
    14         "filesize":None
    15         }
    16 # 自定义报头
    17 filepath = os.path.join(head["filepath"],head["filename"])
    18 # 拼接文件路径
    19 filesize = os.path.getsize(filepath)
    20 head["filesize"] = filesize
    21 n_filesize = filesize
    22 # 获取文件大小
    23 json_head = json.dumps(head).encode("utf8")
    24 # 将报头序列化并转码成utf8
    25 head_len = len(json_head)
    26 # 获取报头文件长度
    27 head_len = struct.pack("i",head_len)
    28 # 将报头长度包装为四个字节
    29 # 参数"i"代表要包装的是数字int类型
    30 sk.send(head_len)
    31 sk.send(json_head)
    32 with open(filepath,"rb") as f:
    33     # 打开文件
    34     while True:
    35         print(str(round(100 - n_filesize/filesize * 100,2)) + "%")
    36         # 显示进度
    37         if n_filesize >= buffer:
    38             # 如果文件还大于buffer,则按buffer大小传输
    39             content = f.read(buffer)
    40             # 读取buffer大小的内容
    41             sk.send(content)
    42             # 发送文件
    43             n_filesize -= buffer
    44             # 文件总大小减去本次发送的大小
    45         else:
    46             content = f.read(n_filesize)
    47             # 读取剩余文件
    48             sk.send(content)
    49             # 发送剩余文件
    50             print("100%")
    51             break
    52 sk.close()
    client/发送端
  • 相关阅读:
    栈区,堆区,全局区,文字常量区,程序代码区 详解
    2010年IT行业十大收购
    三大数据备份方式:完全备份、增量备份以及差异备
    Driver Development Part 1: Introduction to Drivers (code project)
    手工构造典型PE文件(转)
    访问IIS元数据库失败[转]
    代码注入的三种方法(转)
    对象的初始化(转)
    网络和黑客编程基本知识 (转)
    破解linux中root密码(图) 转自csdn
  • 原文地址:https://www.cnblogs.com/changjiangwei/p/11379265.html
Copyright © 2011-2022 走看看