python传输文件

传输文件简单版

server端:

import socket
import struct
import json
import os

share_dir = r‘C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\server\share‘
IP_PORT = (‘127.0.0.1‘, 8999)

def bytes2human(n):
    symbols = (‘K‘, ‘M‘, ‘G‘, ‘T‘, ‘P‘, ‘E‘)
    prefix = {}
    for i, s in enumerate(symbols):
        # << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,
        # 10位就表示1024 即1 << 10=1024 就是2的n次方
        prefix[s] = 1 << (i + 1) * 10
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = float(n) / prefix[s]
            return ‘%.2f%s‘ % (value, s)
    return "%sB" % n

def get(conn,file_name):
    # 3、以读的方式打开文件,读取文件内容发送给客户端
    # 第一步:制作固定长度的报头
    print(‘get‘)
    try:
        header_dict = {
            ‘file_name‘: file_name,
            ‘md5‘: ‘xxx‘,
            ‘file_size‘: os.path.getsize(os.path.join(share_dir, file_name))

        }

        header_json = json.dumps(header_dict, ensure_ascii=‘False‘, indent=2)
        header_bytes = header_json.encode(‘utf-8‘)
        # 第二步:先发送报头的长度
        conn.send(struct.pack(‘i‘, len(header_bytes)))

        # 第三步:再发报头
        conn.send(header_bytes)

        # 第四步:再发送真实的数据
        with open(os.path.join(share_dir, file_name), ‘rb‘) as f:
            for line in f:
                conn.send(line)

    except Exception as e:
        print(e)

def put(conn, file_name):
    """
     接收客户端上传文件
    :param conn:
    :param file_name:
    :return:
    """
    # 2、以写的方式打开一个新文件,接收客户端发来的文件的内容写入服务端新文件
    # 第一步:先收报头的长度
    header_len = conn.recv(4)
    header_size = struct.unpack(‘i‘, header_len)[0]

    # 第二步:再收报头
    header_json = conn.recv(header_size).decode(‘utf-8‘)

    # 第三步:从报头中解析出对真实数据的描述信息
    header_dict = json.loads(header_json)
    file_size = header_dict[‘file_size‘]
    file_name = header_dict[‘file_name‘]

    print(os.path.join(share_dir, file_name))
    # 第四步:接收真实的数据,写入文件
    with open(os.path.join(share_dir, file_name), ‘wb‘) as f:
        recv_size = 0
        while recv_size < file_size:
            line = conn.recv(1024)
            f.write(line)
            recv_size += len(line)
            print(‘总大小:%s   已上传大小:%s‘ % (bytes2human(file_size), bytes2human(recv_size)))

def run():
    server = socket.socket(socket.AF_INET,  socket.SOCK_STREAM)
    server.bind(IP_PORT)

    server.listen(5)
    print(‘starting...‘)

    while True:

        conn, addr = server.accept()
        print(addr)

        while True:
            try:
                # 1 收命令
                res = conn.recv(1024)  # b‘ get a.txt‘
                if not res:break
                # 2、解析命令,提取相应命令参数
                cmds = res.decode(‘utf-8‘).split()  # [get, a.txt]
                if cmds[0] == ‘get‘:
                    get(conn, cmds[1])  # 下载文件
                    # file_name = cmds[1]
                elif cmds[0] == ‘put‘:
                    put(conn, cmds[1])  # 上传文件
            except ConnectionResetError: #适用于windows操作系统
                break
        conn.close()

    server.close()

if __name__ == ‘__main__‘:
    run()

  

client端

  

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import socket
import struct
import json
import os

share_dir = r‘C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\client\download‘
IP_PORT = (‘127.0.0.1‘, 8999)

def bytes2human(n):
    symbols = (‘K‘, ‘M‘, ‘G‘, ‘T‘, ‘P‘, ‘E‘)
    prefix = {}
    for i, s in enumerate(symbols):
        # << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,
        # 10位就表示1024 即1 << 10=1024 就是2的n次方
        prefix[s] = 1 << (i + 1) * 10
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = float(n) / prefix[s]
            return ‘%.2f%s‘ % (value, s)
    return "%sB" % n

def get(client, file_name):
    # 2、以写的方式打开一个新文件,接收服务端发来的文件的内容写入客户的新文件
    # 第一步:先收报头的长度
    header_len = client.recv(4)
    header_size = struct.unpack(‘i‘, header_len)[0]

    # 第二步:再收报头
    header_json = client.recv(header_size).decode(‘utf-8‘)

    # 第三步:从报头中解析出对真实数据的描述信息
    header_dict = json.loads(header_json)
    file_size = header_dict[‘file_size‘]
    file_name = header_dict[‘file_name‘]

    print(os.path.join(share_dir, file_name))
    # 第四步:接收真实的数据,写入文件
    with open(os.path.join(share_dir, file_name), ‘wb‘) as f:
        recv_size = 0
        while recv_size < file_size:
            line = client.recv(1024)
            f.write(line)
            recv_size += len(line)
            print(‘总大小:%s   已下载大小:%s‘ % (bytes2human(file_size), bytes2human(recv_size)))

def put(client, file_name):
    # 向服务端上传文件
    print(‘put‘)
    try:
        if not os.path.isfile(os.path.join(share_dir, file_name)):
            print(‘file:%s is not exists‘ % os.path.join(share_dir, file_name))
            return
        else:
            file_size = os.path.getsize(os.path.join(share_dir, file_name))
            header_dict = {
                ‘file_name‘: file_name,
                ‘md5‘: ‘xxx‘,
                ‘file_size‘: file_size

            }

            header_json = json.dumps(header_dict, ensure_ascii=‘False‘, indent=2)
            header_bytes = header_json.encode(‘utf-8‘)
            # 第二步:先发送报头的长度
            client.send(struct.pack(‘i‘, len(header_bytes)))

            # 第三步:再发报头
            client.send(header_bytes)

            # 第四步:再发送真实的数据
            with open(os.path.join(share_dir, file_name), ‘rb‘) as f:
                for line in f:
                    client.send(line)

    except Exception as e:
        print(e)

def run():
    client = socket.socket(socket.AF_INET,  socket.SOCK_STREAM)
    client.connect(IP_PORT)

    while True:
        # 1、发命令
        cmd = input(‘>> ‘).strip()  # ‘get a.txt‘
        if not cmd:continue
        client.send(cmd.encode(‘utf-8‘))

        if cmd.startswith(‘get‘):
            get(client, cmd.split()[1])
        elif cmd.startswith(‘put‘):
            put(client, cmd.split()[1])

    client.close()

if __name__ == ‘__main__‘:
    run()

 

输出结果

sever:
starting...
(‘127.0.0.1‘, 19074)
get
get
C:\Users\jingjing\PycharmProjects\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\server\share\3.jpeg
总大小:75.36K   已上传大小:1.00K
总大小:75.36K   已上传大小:2.00K
……
总大小:75.36K   已上传大小:75.36K

client:

>> get 1.pptx
C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\client\download\1.pptx
总大小:970.93K   已下载大小:1.00K
总大小:970.93K   已下载大小:2.00K
……
总大小:970.93K   已下载大小:970.93K
>> put 3.jpeg
put
>>

  

传输文件优化版

server端:

import socket
import struct
import json
import os

class TCPServer:

    IP_PORT = (‘127.0.0.1‘, 8999)
    request_queue_size = 5
    allow_reuse_address = False
    max_packet_size = 8192

    share_dir = r‘C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\server\share‘

    def __init__(self, address=IP_PORT, bind_and_activate=True):
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        if bind_and_activate:
            try:
                self.server.bind(address)
                self.server.listen(self.request_queue_size)
                print(‘starting...‘)

            except Exception as e:
                self.server.close()
                raise e

    def get_request(self):
        """Get the request and client address from the socket.
        """
        return self.server.accept()

    def run(self):
        while True:
            self.conn, self.client_addr = self.get_request()
            print(‘from client ‘, self.client_addr)
            while True:
                try:
                    # 1 收命令
                    res = self.conn.recv(self.max_packet_size)  # b‘ get a.txt‘
                    if not res: break
                    # 2、解析命令,提取相应命令参数
                    cmds = res.decode(‘utf-8‘).split()  # [get, a.txt]
                    if hasattr(self, cmds[0]):
                        func = getattr(self, cmds[0])
                        func(cmds[1])
                except ConnectionResetError:  # 适用于windows操作系统
                    break
            self.conn.close()

        self.server.close()

    def put(self, file_name):
        """
         接收客户端上传文件
        :param conn:
        :param file_name:
        :return:
        """
        print(‘get file %s‘ % file_name)

        # 2、以写的方式打开一个新文件,接收客户端发来的文件的内容写入服务端新文件
        # 第一步:先收报头的长度
        header_len = self.conn.recv(4)
        header_size = struct.unpack(‘i‘, header_len)[0]

        # 第二步:再收报头
        header_json = self.conn.recv(header_size).decode(‘utf-8‘)

        # 第三步:从报头中解析出对真实数据的描述信息
        header_dict = json.loads(header_json)
        file_size = header_dict[‘file_size‘]
        file_name = header_dict[‘file_name‘]

        print(os.path.join(self.share_dir, file_name))
        # 第四步:接收真实的数据,写入文件
        with open(os.path.join(self.share_dir, file_name), ‘wb‘) as f:
            recv_size = 0
            while recv_size < file_size:
                line = self.conn.recv(self.max_packet_size)
                f.write(line)
                recv_size += len(line)
                rate = recv_size / file_size * 100
                print(‘总大小:%s   已上传:%%%.2f‘ % (self.bytes2human(file_size), rate))

    @staticmethod
    def bytes2human(n):
        symbols = (‘K‘, ‘M‘, ‘G‘, ‘T‘, ‘P‘, ‘E‘)
        prefix = {}
        for i, s in enumerate(symbols):
            # << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,
            # 10位就表示1024 即1 << 10=1024 就是2的n次方
            prefix[s] = 1 << (i + 1) * 10
        for s in reversed(symbols):
            if n >= prefix[s]:
                value = float(n) / prefix[s]
                return ‘%.2f%s‘ % (value, s)
        return "%sB" % n

    def get(self, file_name):
        # 3、以读的方式打开文件,读取文件内容发送给客户端
        # 第一步:制作固定长度的报头
        print(‘send file %s‘ % file_name)
        try:
            header_dict = {
                ‘file_name‘: file_name,
                ‘md5‘: ‘xxx‘,
                ‘file_size‘: os.path.getsize(os.path.join(self.share_dir, file_name))

            }

            header_json = json.dumps(header_dict, ensure_ascii=‘False‘, indent=2)
            header_bytes = header_json.encode(‘utf-8‘)
            # 第二步:先发送报头的长度
            self.conn.send(struct.pack(‘i‘, len(header_bytes)))

            # 第三步:再发报头
            self.conn.send(header_bytes)

            # 第四步:再发送真实的数据
            with open(os.path.join(self.share_dir, file_name), ‘rb‘) as f:
                for line in f:
                    self.conn.send(line)

        except Exception as e:
            print(e)

if __name__ == ‘__main__‘:
    s = TCPServer()
    s.run()

  

client端:

import socket
import struct
import json
import os

class TCPClient:

    IP_PORT = (‘127.0.0.1‘, 8999)
    request_queue_size = 5
    allow_reuse_address = False
    max_packet_size = 8192
    share_dir = r‘C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\client\download‘

    def __init__(self, address=IP_PORT, connect=True):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        if connect:
            try:
                self.client.connect(address)
            except Exception as e:
                self.client.close()
                raise e

    def run(self):
        while True:
            # 1、发命令
            inp = input(‘>> ‘).strip()  # ‘get a.txt‘
            if not inp: continue
            self.client.send(inp.encode(‘utf-8‘))
            cmd = inp.split()

            if hasattr(self, cmd[0]):
                func = getattr(self, cmd[0])
                func(cmd[1])

        client.close()

    @staticmethod
    def bytes2human(n):
        symbols = (‘K‘, ‘M‘, ‘G‘, ‘T‘, ‘P‘, ‘E‘)
        prefix = {}
        for i, s in enumerate(symbols):
            # << 左移” 左移一位表示乘2 即1 << 1=2,二位就表示4 即1 << 2=4,
            # 10位就表示1024 即1 << 10=1024 就是2的n次方
            prefix[s] = 1 << (i + 1) * 10
        for s in reversed(symbols):
            if n >= prefix[s]:
                value = float(n) / prefix[s]
                return ‘%.2f%s‘ % (value, s)
        return "%sB" % n

    def get(self, file_name):
        # 2、以写的方式打开一个新文件,接收服务端发来的文件的内容写入客户的新文件
        # 第一步:先收报头的长度
        header_len = self.client.recv(4)
        header_size = struct.unpack(‘i‘, header_len)[0]

        # 第二步:再收报头
        header_json = self.client.recv(header_size).decode(‘utf-8‘)

        # 第三步:从报头中解析出对真实数据的描述信息
        header_dict = json.loads(header_json)
        file_size = header_dict[‘file_size‘]
        file_name = header_dict[‘file_name‘]

        print(os.path.join(self.share_dir, file_name))
        # 第四步:接收真实的数据,写入文件
        with open(os.path.join(self.share_dir, file_name), ‘wb‘) as f:
            recv_size = 0
            while recv_size < file_size:
                line = self.client.recv(self.max_packet_size)
                f.write(line)
                recv_size += len(line)
                rate = recv_size / file_size * 100
                print(‘总大小:%s   已下载:%%%.2f‘ % (self.bytes2human(file_size),rate))

    def put(self, file_name):
        # 向服务端上传文件
        print(‘put‘)
        try:
            if not os.path.isfile(os.path.join(self.share_dir, file_name)):
                print(‘file:%s is not exists‘ % os.path.join(self.share_dir, file_name))
                return
            else:
                file_size = os.path.getsize(os.path.join(self.share_dir, file_name))
                header_dict = {
                    ‘file_name‘: file_name,
                    ‘md5‘: ‘xxx‘,
                    ‘file_size‘: file_size

                }

                header_json = json.dumps(header_dict, ensure_ascii=‘False‘, indent=2)
                header_bytes = header_json.encode(‘utf-8‘)
                # 第二步:先发送报头的长度
                self.client.send(struct.pack(‘i‘, len(header_bytes)))

                # 第三步:再发报头
                self.client.send(header_bytes)

                # 第四步:再发送真实的数据
                with open(os.path.join(self.share_dir, file_name), ‘rb‘) as f:
                    for line in f:
                        self.client.send(line)

        except Exception as e:
            print(e)

if __name__ == ‘__main__‘:
    c = TCPClient()
    c.run()

  

输出结果:

 

sever:
starting...
from client  (‘127.0.0.1‘, 3500)
send file 3.jpeg
get file 1.pptx
C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\server\share\1.pptx
总大小:970.93K   已上传:%0.82
……
总大小:970.93K   已上传:%99.96
总大小:970.93K   已上传:%100.00

client:
 C:/py3Project/路飞/第三模块/第二章网络编程/05_文件传输/简单版本/client/file_client.py
>> get 3.jpeg
C:\py3Project\路飞\第三模块\第二章网络编程\05_文件传输\简单版本\client\download\3.jpeg
总大小:75.36K   已下载:%10.62
……
总大小:75.36K   已下载:%99.49
总大小:75.36K   已下载:%100.00
>> put 1.pptx
put
>>

  

  

原文地址:https://www.cnblogs.com/xiao-apple36/p/9286610.html

时间: 2024-12-17 04:21:55

python传输文件的相关文章

利用python 传输文件

最近在学python3 发现了一个很有用的功能,该功能可以将安装python 的机器作为一台http 服务器来分享本机的文件, 具体的使用记录如下 python3 的使用方法 直接在windows 的cmd 窗口下输入:python -m http.server(默认8000,支持端口配置 如 python -m http.server 80) 命令运行之后,会发现启动一个server,截图如下 之后就可以在浏览器上访问文件了 ps:python2 的命令为python -m SimpleHTT

初试python多线程传输文件

新手!!求见谅!!望多指点 由于工作原因,试用期需要学习python,因为运维工作全都是由python完成,幸好有点python基础,知道什么是列表,元组,字符,字典什么的,要不然死翘翘的. 创建多线程主要的步骤有: 1.创建一个函数,这个函数是多线程需要多次运行的内容 2.利用for循环生成对应函数的多个成品(就是说这个函数已经赋予了需要的参数了,直接运行就可以的了) 3.利用for循环开始执行函数 4.利用for循环使主程序挂起,等待子进程完成后再执行其他动作 ---------------

Python 的网络传输文件功能的设计与实现

摘要:Python 是目前较流行的程序设计语言之一,它具有简单易学代码简洁等特点,并且Python 提供了大量的功能库文件,开发大型应用程序时非常方便,广泛用于网站开发.游戏后台开发等方面.该文基Python 提供的网络编程库,开发了网络文件传输的功能,该功能可以快速有效地在互联网上进行文件的传输.1 Python 介绍Python是由Guido van Rossum在1989年底创造的,在1991年发行了第一个公开版本.Python是一种面向对象的.解释型的.动态数据类型的程序设计语言.Pyt

Python实现Windows和Linux之间互相传输文件(文件夹)的方法

项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件.所以就需要实现如何把文件从Windows系统传输到Linux系统中. 在项目中使用了pscp.exe这个工具,只要按照pscp.exe的使用说明操作即可.只要进入pscp.exe的安装位置,然后输入pscp即可查看pscp的使用说明. 下面是我机器上的: 使用Python实现也挺简单的,下面的code主要介绍4中情况: 1. windows传输文件到Linux 2. windows传输

Python不同电脑之间传输文件实现类似scp功能不输密码

SCP vs SFTP 通过paramiko还可以传输文件,如何通过paramiko在计算机之间传输文件,通过阅读官方文档,发现有如下两种方式: sftp = paramiko.SFTPClient.from_transport(ssh.get_transport()) sftp = ssh.open_sftp() 即新建一个SFTPClient对象,该对象复用之前的SSH连接,因此,我们使用sftp传输文件时,不需要再次进行用户认证. 文件上传 In [59]: sftp.put('memor

【转】QQ传输文件原理参考(来自互联网)

QQ的文件发送是怎样的过程呢?通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话.随即,发送计算机与接收计算机就会在确定好的端口范围内,建立起TCP或UDP连接开始文件的检索与传输. 在默认状态下,QQ优先采用了UDP(User Data Protocol,用户数据报协议)协议传送数据,而对可靠性要求高的数据通讯系统往往使用TCP协议传输数据.与TCP协议不同,UDP协议并不提供数据传送的验

windows系统往远程桌面上共享文件(某磁盘下文件)如何远程连接传输文件。

现在很多人跑程序都去连接linux系统的服务器,但是仍然有部分人没用过linux命令或者说觉得学习linux命令太过于麻烦,就仍然在使用windows系统的服务器,但是在进入windows远程桌面中,需要将自己的运行文件在pycharm中打开,这个时候就需要将自己电脑中的运行文件拉到远程系统中,这个时候就需要远程连接传输文件了.(放心,直接从自己电脑上往远程桌面上拖拽文件是行不通的) 本博主在自己尝试之后写下了清晰的步骤,帮助别人的同时也是帮助自己加深一下印象,何乐而不为呢? 首先在电脑上搜索出

用scp命令来通过ssh传输文件,ssh推送.py程序到CentOS7服务器端出现lost connection错误

ssh推送.py程序到CentOS7服务器端运行出现lost connection错误 (base) F:\workspace>dir 驱动器 F 中的卷是 新加卷 卷的序列号是 C2B9-6277 F:\workspace 的目录2019/03/13 16:44 <DIR> .2019/03/13 16:44 <DIR> ..2019/03/13 16:47 <DIR> .idea2019/03/13 10:11 <DIR> .ipynb_check

兼容所有系统的局域网传输文件通用方法

既然要通讯,那么必须有服务器和客户端.本文使用sshd做服务器,scp做客户端. 接受文件的一方必须使用sshd启动并绑定本机局域网端口,如0.0.0.0:22 绑定方法就是配置/etc/ssh/sshd_config这个配置文件,如果A(windows/linux/macos)向B(windows/linux/macos)发送文件,那么有两种方式: 假设A的用户名为userA,IP为192.168.1.10,文件路径/1.txt A运行sshd服务/usr/sbin/sshd,B运行scp [