0 前言:

ftp客户端相信大家都用过,那么我们为什么还要用Python写ftp客户端呢?

我想有两个原因:

一是写出更好的ftp客户端应用程序,方便大家使用;

二是定制一些特殊服务,例如每天定时下载/上传某文件;

我还没能力也没时间写出ftp客户端应用程序,前期先分析一下python写ftp客户端的核心部分,即实现上传和下载的关键部分。

首先看一下ftp服务器/客户端架构:

1 FTP服务器/客户端

ftp架构

上图展示了ftp的工作流程:

1.客户端连接远程主机上的FTP 服务器。

2.客户端输入用户名和密码(或“anonymous”和电子邮件地址)。

3.客户端进行各种文件传输和信息查询操作。

4.客户端从远程FTP 服务器退出,结束传输。

下面是一段Python伪代码。from ftplib import FTP

f = FTP('some.ftp.server')

f.login('anonymous', 'your@email.address')

:

f. quit()

当然,这只是一般情况下的流程。有时,由于网络两边计算机的崩溃或网络的问题,会导致整个传输在完成之前就中断。

如果客户端超过15 分钟(900 秒)还没有响应,FTP 连接就会超时并中断。

在底层,FTP 只使用TCP,而不使用UDP。

另外,可以将FTP 看作客户端/服务器编程中的特殊情况。因为这里的客户端和服务器都使用两个套接字来通信:

一个是控制和命令端口(21 号端口),另一个是数据端口(有时是20 号端口),如上图 所示。

FTP 有两种模式:主动和被动。只有在主动模式下服务器才使用数据端口。

在服务器把20 号端口设置为数据端口后,它“主动”连接客户端的数据端口。而在被动模式下,服务器只是告诉客户端随机的数据端口号,客户端必须主动建立数据连接。

2 客户端FTP 程序示例#!/usr/bin/env python# coding=utf-8import ftplib

import os

import socket

import pdb

HOST = 'ftp.debian.org'DIRN = 'debian/tools'FILE = 'loadlin.exe'def main():    try:

f = ftplib.FTP(HOST)

except (socket.error, socket.gaierror) as e:        print 'ERROR: cannot reach "%s"' % HOST        return

print '*** Connected to host "%s"' % HOST    try:

f.login()

except ftplib.error_perm:        print 'ERROR: cannot login anonymously'

f.quit()        return

print '*** Logged in as "anonymous"'

try:

f.cwd(DIRN)

except ftplib.error_perm:        print 'ERROR: cannot CD to "%s"' % DIRN

f.quit()        return

print '***  changed to "%s" folder' % DIRN    try:

f.retrbinary('RETR %s' % FILE,

open(FILE,'wb').write)

except ftplib.error_perm:        print 'ERROR: cannot read file "%s"' % FILE

os.unlink(FILE)    else:        print '*** Download "%s" to CWD' %FILE

f.quit()if __name__ == '__main__':

main()

运行结果:

ftp客户端运行结果:可以看出loadlin.exe文件被更新了。

3 疑问

上面编写的客户端代码对ftp.debian.org站点可以正常连接,为什么有的ftp服务器明明可以ping通却无法连接?

ping ftp.python.org

然而,却无法连接到服务器:

无法连接ftp.python.org

请高人指点!!谢谢!!

作者:rebirth_2017

链接:https://www.jianshu.com/p/bb8207a1ff75

python编写ftp客户端_用Python写FTP客户端程序相关推荐

  1. python编写脚本方法_【Python】教你一步步编写banner获取脚本

    Hello 各位小伙伴们大家好,周末过的愉快吗? 刚好最近学习了使用python编写banner获取脚本,今天就跟大家一起一步一步再学习一遍吧. Part.1 说明篇 什么是banner? banne ...

  2. 哪些软件是python编写出来的_用Python编程需要什么软件?

    用Python编程需要什么软件?Python编程是一门适合新手入门的编程语言,现在有不少程序员业余时间学习Python编程语言,学习Python找到好工具会大大提高学习的效率.好用的Python编程软 ...

  3. python编写木马攻击_用Python写一个自动木马程序

    电脑作为大家日常办公的工具,最怕的一件事情之一就是被偷,当我们的电脑被盗的时候,不仅仅是电脑本身,更重要的是电脑存储的资料都会丢失.如何尽快的找回电脑需要我们想点办法,今天就教大家一个好的技巧,虽说不 ...

  4. 用python编写学生管理系统_用python写一个简单的学生管理系统

    要求如下:1.一个循环2中输入内容的能力.显示函数添加新名片显示所有查询的名片3退出系统.让用户输入所需的操作,如输入1,2,3,04.新列表提示用户输入名称和输入电子邮件提示成功添加新名片.5.显示 ...

  5. 用python编写函数回归分析_用python编写函数的logistic回归系数

    下面是逻辑回归的代码.在from sklearn.linear_model import LogisticRegression from sklearn.model_selection import ...

  6. python编写测试系统_纯 python 编写的一套 dubbo 测试平台

    因组织要求,需要一个Dubbo接口的测试工具,经多方研究,遂决定要写一个不需要编写任何代码,直接在页面上填写数据就能直接运行Dubbo接口的测试工具,类似于Postman编写http接口一样简单. 整 ...

  7. python编写脚本方法_使用Python编写提取日志中的中文的脚本的方法

    由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提取工具,代替手工提取的繁杂,涉及中文字符,正则表达式不好匹配 ...

  8. python编写登录接口_使用python编写一个登录接口

    需求: 编写登录接口 输入用户名密码 认证成功后 显示欢迎信息 输入三次后锁定 用户信息文件 黑名单的文件 黑名单里检查,不让登录 用户名密码判定 流程图: 代码:#!/usr/bin/env pyt ...

  9. python编写视频播放器_基于Python编写的语音播放软件

    单位经常使用广播进行临时事项的通知 ( 将文字转换为语音然后通过功放广 播 ) ,但是市面上多数语音播放软件都是收费的,要么发音失真,要么不够稳定--经常 出现莫名其妙的故障,容易给工作带来被动.学 ...

  10. python编写ai电话_用Python编写一个国际象棋AI程序

    最近我用Python做了一个国际象棋程序并把代码发布在Github上了.这个代码不到1000行,大概20%用来实现AI.在这篇文章中我会介绍这个AI如何工作,每一个部分做什么,它为什么能那样工作起来. ...

最新文章

  1. 【冷门实用小工具】JAVA和C#轻量级的UML图绘制工具NClass,UML类图编辑器免安装版【亲测有效】
  2. 中职 学生学php学什么区别,职业高中和中专的区别是什么?哪个学历高
  3. 32读取ltc的温度值_Arduino基础入门篇29—模拟温度传感器LM35
  4. python简单代码加法-Python tkinter实现简单加法计算器代码实例
  5. HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面的距离)
  6. javascript 面向对象编程小记
  7. php7.2 event扩展php_sockets_le_socket错误解决
  8. win11WiFi无法连接网络怎么办 Windows11WiFi无法连接网络的解决方法
  9. 笔试c语言实现栈,栈的实现与操作(C语言实现)
  10. js读取剪切板html,JS获取剪贴板的内容
  11. 朗强:HDMI分配延长器的作用
  12. Ubuntu文件系统损坏修复
  13. WFQ/CBWFQ/LLQ介绍
  14. 笔记本上怎么怎么暂停cmd打印窗口
  15. 如何对下拉菜单进行截图
  16. ubuntu设置文件夹共享
  17. matlab 棋盘格畸变矫正
  18. 时间频度和时间复杂度
  19. 密码正确登入不了网络计算机,电脑突然断网,然后重启输入密码就登陆不了电脑为什么?老是显示当前电脑时间与网络时间不一致...
  20. idea操作redis

热门文章

  1. 没有add framework support选项_什么?小型机房没有“线”也能很好的管理机房?
  2. Cpp / 通用引用、引用折叠与完美转发问题
  3. C/Cpp / STL / 各个实现版本的说明
  4. Arduino--DHT11温湿度传感器
  5. Rtx userlist.php,【图片】【C语言】【控制台】提取腾讯通用户信息(id,用户名,手机)【erbi_lucifer吧】_百度贴吧...
  6. mysql window怎么安装补丁_window下mysql安装步骤
  7. 如何读群晖硬盘_更新教程:群晖下直接挂载WINDOWS的NTFS格式硬盘,试验通过......
  8. 为什么python打包的应用那么大_浅谈python3打包与拆包在函数的应用详解
  9. ALVのイベントを取得する方法
  10. [源码和文档分享]基于C++实现的运动会统分系统