• 技术文章 >Python技术 >Python高级

    python怎么传送文件

    晓曦&sea晓曦&sea2020-07-15 14:08:47转载4439

    在python中传送文件的方法:1、将报头转换成字符串【json.dumps】, 再将字符串的长度打包;2、发送报头长度和报头内容,然后放真实内容;3、将报头长度解压,得到头部信息的大小,再接收头部信息,反序列化即可

    思路:

    # 先将报头转换成字符串(json.dumps), 再将字符串的长度打包
    # 发送报头长度,发送报头内容,最后放真实内容
    # 报头内容包括文件名,文件信息,报头
    # 接收时:先接收4个字节的报头长度,
    # 将报头长度解压,得到头部信息的大小,在接收头部信息, 反序列化(json.loads)
    # 最后接收真实文件

    服务端

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    # @File    : 文件传输-服务端.py

    # @Software: PyCharmfrom socket import *import structimport jsonimport ostcp_server = socket(AF_INET, SOCK_STREAM)ip_port = (('127.0.0.1', 8080))buffsize = 1024

    #   端口的重复利用

    tcp_server.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)tcp_server.bind(ip_port)tcp_server.listen(5)print('还没有人链接')

    while True:   

           '''链接循环'''

           conn, addr = tcp_server.accept()   

           print('链接人的信息:', addr)   

           while True:       

                  if not conn:           

                        print('客户端链接中断')           

                        break            

                   '''通信循环'''               

                   filemesg = input('请输入要传送的文件名加后缀>>>').strip()            

                   filesize_bytes = os.path.getsize(filemesg) # 得到文件的大小,字节              

                   filename = 'new' + filemesg               

                   dirc = {          

                           'filename': filename,      

                           'filesize_bytes': filesize_bytes,

                    }              

                    head_info = json.dumps(dirc)  # 将字典转换成字符串               

                    head_info_len = struct.pack('i', len(head_info))

                    #  将字符串的长度打包               

                    #   先将报头转换成字符串(json.dumps), 再将字符串的长度打包               

                    #   发送报头长度,发送报头内容,最后放真是内容               

                    #   报头内容包括文件名,文件信息,报头               

                    #   接收时:先接收4个字节的报头长度,               

                    #   将报头长度解压,得到头部信息的大小,在接收头部信息, 反序列化(json.loads)               

                    #   最后接收真实文件               

                    conn.send(head_info_len)  # 发送head_info的长度               

                    conn.send(head_info.encode('utf-8'))      

                    #   发送真是信息               

                    with open(filemesg, 'rb') as f:                      

                         data = f.read()                       

                         conn.sendall(data)     

                    print('发送成功')

    客户端

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    # @File    : 文件传输_客户端.py

    # @Software: PyCharmfrom socket import *

    import struct

    import json

    import os

    import sys

    import time

    from 进度条 import process_bar

     

    tcp_client = socket(AF_INET, SOCK_STREAM)

    ip_port = (('127.0.0.1', 8080))

    buffsize = 1024

    tcp_client.connect_ex(ip_port)

    print('等待链接服务端')

    while True:

       

          head_struct = tcp_client.recv(4) # 接收报头的长度,

          if head_struct:      

                print('已连接服务端,等待接收数据')

       

          head_len = struct.unpack('i', head_struct)[0] # 解析出报头的字符串大小

          data = tcp_client.recv(head_len)# 接收长度为head_len的报头内容的信息 (包含文件大小,文件名的内容)    

          head_dir = json.loads(data.decode('utf-8'))

         

          filesize_b = head_dir['filesize_bytes']

         

          filename = head_dir['filename']   

            #   接受真的文件内容

        

         recv_len = 0

        

         recv_mesg = b''

        

         old = time.time()

       

          f = open(filename, 'wb')  

         while recv_len < filesize_b:

        

                 percent = recv_len / filesize_b

     

         

                process_bar(percent)       

                if filesize_b - recv_len > buffsize:

     

               

                      recv_mesg = tcp_client.recv(buffsize)

                

                     f.write(recv_mesg)

                

                     recv_len += len(recv_mesg)      

                  else:

                

                     recv_mesg = tcp_client.recv(filesize_b - recv_len)

         

                     recv_len += len(recv_mesg)

                

                     f.write(recv_mesg)  

         print(recv_len, filesize_b)

       

          now = time.time()

       

          stamp = int(now - old)  

          print('总共用时%ds' % stamp)

        

          f.close()

    进度条

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    # @File    : 进度条.py

    # @Software: PyCharm

    import sys

    import time

    def process_bar(precent, width=50):        use_num = int(precent*width)        space_num = int(width-use_num)        precent = precent*100 

      #   第一个和最后一个一样梯形显示, 中间两个正确,但是在python2中报错   # print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent))    # print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent), end='\r')    print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent),file=sys.stdout,flush=True, end='\r')

        # print('[%s%s]%d%%'%(use_num*'#', space_num*' ',precent),file=sys.stdout,flush=True)

    #for i in range(21):

    #       precent = i/20

    #       process_bar(precent)

    #        time.sleep(0.2)

    1.jpg

    推荐课程:Python进阶视频教程

    专题推荐:python 文件传输
    上一篇:python如何模拟搜索请求 下一篇:python怎么查看mat格式的文件

    相关文章推荐

    • python3.7如何调试• python如何计算数的阶乘• python如何访问私有方法• python不能覆盖文件内容如何解决• python如何模拟搜索请求

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网