python-应用层-网络编程-FTP

前面描述的基于TCP/UDP协议的网络程序开发,主要是针对传输层协议的底层代码实现 在实际操作过程中,更多的情况是直接操作应用层的数据协议的网络程序开发,如文件传输协议FTP,邮件协议SMTP等等

这一部分针对应用层的协议下网络程序的开发做一个深入的处理

3.1. FTP文件服务

FTP:File Transfer Protocal 文件传输协议 工作在应用层的协议,由Jon Postel和Joyce Reynolds开发并记录在RPC959号文档中 FTP协议主要用于匿名下载文件或者在两台计算机之间进行文件的传输工作!

FTP协议底层采用的是TCP协议完成的网络数据传输,为了方便两台计算机上的文件正确的进行交互,FTP协议封装了两个套接字完成文件操作,第一个工作在21端口的套接字专门用于传输命令控制指令,第二个工作在20端口的套接字专门传输具体文件数据

FTP客户端-服务器连接处理方式

3.1.1. FTP客户端程序开发

FTP网络程序的开发,我们不需要关注服务端的程序,服务端的软件程序开发和文件管理操作可以有大量的现成的工具去操作完成,而FTP如果作为应用软件的一部分功能,客户端程序的操作才是应用软件中最常规的操作

PYTHON中提供了对FTP操作友好的支持,通过内建标准模块ftplib提供

针对FTP客户端的逻辑流程,进行如下步骤分析:

 客户端——连接到服务器  客户端——账号+密码登录服务器  发出服务请求——控制指令、数据传输指令——处理响应数据  客户端退出

伪代码操作如下

from ftplib import FTP

ftp = FTP(“ftp.server.com”)

[ftp.login(‘account](ftp://ftp.login('account)’, ‘password’)

# 数据交互

ftp.quit()

3.1.2 FTP类型常见属性方法

属性/方法

描述

login(user=’anonymous’, passwd=’’, acct=’’)

登录FTP服务器

pwd()

查看当前路径

cwd(path)

切换路径到指定的path路径

dir(path [,…[,cb]])

显示path路径中文件的内容

nlst([path [,….]])

类似dir(),返回文件名称列表

retrlines(cmd [, cb])

给定ftp命令,下载文本文件;回调函数cb用于处理每一行文本

retrbinary(cmd, cb [, bs=8192 [, ra]])

给定ftp命令,下载二进制文件;回调函数cb处理每次读取的8k数据

storlines(cmd, f)

给定ftp命令,上传文本文件f

storbinary(cmd, f [, bs=8192])

给定ftp命令,上传二进制文件f

rename(old, name)

重命名old文件为new

delete(path)

删除path指定的某个文件

mkd(directory)

创建一个目录directory

rmd(directory)

删除指定的目录directory

quit()

关闭连接,退出FTP

3.1.3. 客户端FTP程序开发

搭建好我们的服务器环境,指定连接的FTP服务器信息、文件路径信息

# 引入需要的模块
import ftplib, socket

# 定义FTP主机信息
HOST = '192.168.1.108'
DIRN = '/home/damu/ftpwork/'
FILE = 'my_demo.tar.gz'


class FtpClient:
    '''自定义FTP客户端类型'''
    def __init__(self, host, username, password):
        '''
        初始化方法
        :param host:目标主机
        :param directory:目标主机目录
        :param files:要下载的文件
        :param username:登录账号
        :param password:登录密码
        '''
        self.host = host

        self.username = username
        self.password = password

    def ftp_dowload(self, directory, file):
        '''下载文件主要方法'''
        self.directory = directory
        self.file = file

        self.__ftp_connect()
        self.__ftp_login()
        self.__ftp_cwd()
        self.__ftp_download()
        self.__ftp_quit()

    def __ftp_connect(self):
        '''连接服务器的方法'''
        try:
            self.ftp = ftplib.FTP(self.host)
        except (socket.error, socket.gaierror) as e:
            print("目标主机不可访问:", self.host)
        else:
            print("主机连接成功", self.host)

    def __ftp_login(self):
        '''登录FTP服务器的方法'''
        try:
            self.ftp.login()
        except ftplib.error_perm:
            print("目标主机不能匿名登录,使用账号密码登录")
            try:
                self.ftp.login(user=self.username, passwd=self.password)
            except:
                print("账号或者密码有误")
            else:
                print("登录成功")

    def __ftp_cwd(self):
        '''修改工作目录的方法'''
        try:
            self.ftp.cwd(self.directory)
        except ftplib.error_perm as e:
            print("路径修改失败,没有权限", self.directory)
        else:
            print("路径修改完成")

    def __ftp_download(self):
        '''下载文件核心方法'''
        try:
            self.ftp.retrbinary('RETR {}'.format(self.file), open(self.file, 'wb').write)
        except ftplib.error_perm as e:
            print("文件下载失败...")
        else:
            print("文件下载完成")

    def __ftp_quit(self):
        '''退出FTP客户端'''
        self.ftp.quit()
        print('程序退出...')


if __name__ == "__main__":
    # 创建FTP客户端对象
    ftp = FtpClient(HOST, 'damu', '123456')
    # 下载指定路径下的文件
    ftp.ftp_dowload(DIRN, FILE)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

Linux系统下常用的数据备份方法

Linux作为网络操作系统,在服务器方面的应用越来越广泛。作为专门的网络服务器,一个重要功能就是对服务器数据进行备份,以确保数据的安全。本文将介绍在Linux系...

25180
来自专栏ZKEASOFT

纸壳CMS可视化建站系统创建多语言网站

纸壳CMS已经从架构上支持多语言。但是多语言功能默认是没有开启的。您可以从设置中开启多语言,或者随时关闭它,您可以随时进行切换。

22300
来自专栏L宝宝聊IT

LVS负载均衡群集--NAT模式

22430
来自专栏L宝宝聊IT

LVS负载均衡群集--NAT+DR模式

18280
来自专栏小明plus

在2018年如何优雅的开发一个typescript语言的npm包?

很多时候,我们可能想要用 typescript 语言来创建一些模块,并提交到 npm 供别人使用,

1.6K110
来自专栏散尽浮华

nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。 废话不多说,下面对测试环境下的nginx反向代理+缓存...

1.2K90
来自专栏Java成神之路

JAVA之 JDK安装及环境变量配置

Path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

11610
来自专栏屈政斌的专栏

【腾讯云的1001种玩法】centos 7 部署 dotnetcore + Angular2 实践

本文主要讲述了使用腾讯云主机,在centos 7 部署 dotnetcore + Angular2 的实践过程,该项目目前只是用于学习 dotnetcore ...

2.7K10
来自专栏北京马哥教育

linux下用tar进行数据备份

豌豆贴心提醒,本文阅读时间7分钟 本机上数据的手工备份 Linux系统上配有功能强大的tar命令,可以灵活地备份数据。 tar最初是为了制作磁带备份而设计的把...

36880
来自专栏流柯技术学院

selenium + python自动化测试环境搭建

-------------------------------------------------------------

19820

扫码关注云+社区

领取腾讯云代金券