用python自己实现一个文件传输。其实python的ftplib模块中封装好了实现FTP传输的功能。但是为了理解文件传输机制,决定自己写一个。

客户端可以向服务器上传和下载文件。

get从服务器下载,post向服务器上传文件。

工程主要目录:


get方法流程图:

put方法和get方法差不多,只是由客户端发送文件,服务器接收

Put方法流程图:
客户端代码:
# -*- coding: utf-8 -*-
##
# ftp_client
# Created on 2016 12 15
# @author:huangpingyi
##
import socket
import osclass FTP(object):def __init__(self, host, port):self.host = hostself.port = portdef put(self,msg):  #put local_fileprint '--put:', msgif len(msg) > 0:remote_filename = msg[0]#判断文件是否存在if os.path.isfile(remote_filename):file_size = os.path.getsize(remote_filename)#发送文件名和大小给服务cmd_msg = "file_transfer|put|%s|%s" % (remote_filename,file_size)self.sock.send(cmd_msg)#服务器返回应答feedback = self.sock.recv(1024)print '--feedback:',feedback#如果服务器准备好,就开始传输if feedback.startswith("file_transfer|put|ready"):f = file( remote_filename,'rb')send_size =0#文件很大,传送不完,每次以1024传输while not file_size == send_size:if file_size-send_size>1024:data = f.read(1024)send_size += 1024#最后一轮else:data = f.read(file_size-send_size)send_size+=file_size-send_sizeself.sock.send(data)else:print "--send file %s " % remote_filenamef.close()else:print feedbackdef get(self,msg):  #get remote_fileprint '--get:', msgif len(msg) > 0:remote_filename = msg[0]#发送get消息给服务器cmd_msg = "file_transfer|get|%s" % remote_filenameself.sock.send(cmd_msg)#服务器查看文件是否存在并响应feedback = self.sock.recv(1024)print '--feedback:',feedback#如果文件存在,服务器发送文件大小过来if feedback.startswith("file_transfer|get|ready"):#文件大小file_size = int(feedback.split("|")[-1])#客户端发送准备接收ack_msg = "file_transfer|get|recv|ready"self.sock.send(ack_msg)#建立文件f = file("recv\%s"% remote_filename,'wb')#客户端接受#收到的数据和总大小比较recv_size =0#文件很大,接受不完,开始计数,每次接收1024while not file_size == recv_size:if  file_size-recv_size>1024:data = self.sock.recv(1024)recv_size += len(data)#收到的小于1024,实时性不一定是1024#最后一轮else:data = self.sock.recv(file_size-recv_size)recv_size+=file_size-recv_sizef.write(data)else:print "--recv file %s " % remote_filenamef.close()else:print feedbackdef interactive(self):#客户端交互while True:user_input = raw_input("ftp_client::").strip()if len(user_input) == 0:continuecmd = user_input.split()if  hasattr(self, cmd[0]):#用反射判断用户是要get还是put#判断对象是否有cmd[0]方法func = getattr(self, cmd[0])#有则将cmd[0]方法赋值func(cmd[1:])#把后面的参数传给cmd[0]方法,并执行cmd[0]函数else:#如果是其他命令,就打印错误print "\033[31;1mWrong cmd usage!\033[0m"def connect(self):#连接self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.sock.connect((self.host, self.port))self.interactive()if __name__ == '__main__':ftp = FTP('localhost',7126 )ftp.connect()

服务器端代码:

# -*- coding: utf-8 -*-
##
# socket_server
# Created on 2016 12 15
# @author:huangpingyi
##import SocketServer
import osclass MyTCPHandler(SocketServer.BaseRequestHandler):def handle(self):while True:data = self.request.recv(1024).strip()data = data.split("|")if hasattr(self, data[0]):func = getattr(self, data[0])func(data[1:])#将后面参数传入file_transferdef file_transfer(self,msg):if msg[0] == "get":print "----going to send file:%s to client" % msg[1]filename = msg[1]if os.path.isfile(filename):#判断文件存在#如果文件存在,就判断文件大小file_size = os.path.getsize(filename)#将文件大小发送給客户端ack_msg = "file_transfer|get|ready|%s" % file_sizeself.request.send(ack_msg)client_ack = self.request.recv(1024)print '-->client ack:', client_ack#如果客户端准备好就开始传输文件if client_ack.startswith("file_transfer|get|recv|ready"):f = file(filename, "rb")send_size =0Flag = Truewhile Flag:if send_size+1024 > file_size:data = f.read(file_size-send_size)Flag = Falseelse:data = f.read(1024)send_size+=1024self.request.send(data)print '--file %s send done---' % filenamef.close()else:ack_msg = "file_transfer|get|doesn't exist"self.request.send(ack_msg)if msg[0] == "put":print "----going to put file:%s" % msg[1]#获取文件名字和大小file_name = msg[1]file_size = msg[2]base_path = "D:\untitled4"#发送准备好接收的请求ack_msg = "file_transfer|put|ready"self.request.send(ack_msg)recv_size = 0#上传文件路径拼接file_dir = os.path.join(base_path,file_name)f = file(file_dir,'wb')Flag = Truewhile Flag:#未上传完毕,if int(file_size)>recv_size:#最多接收1024,可能接收的小于1024data =self.request.recv(1024)recv_size+=len(data)#上传完毕,则退出循环else:recv_size = 0Flag = Falsecontinue#写入文件f.write(data)print 'upload successed.'f.close()if __name__ == '__main__':HOST,PORT = 'localhost',7126server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)server.serve_forever()

测试效果:

执行get 操作

客户端:

服务器:

刷新recv文件夹,便可看见test.txt

执行put操作

客户端:

服务器:                                                                                                                                                                                                                                                                                                       

用python实现FTP传输相关推荐

  1. python ftp上传_Python FTP传输的简单示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 访问FTP,无非两件事情:upload和download,最近在项目中需要从ftp下载大量文件,然 ...

  2. 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...

    文章主要为大家详细介绍了python实现ftp文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!!! 本文实例为大家分享了python实现ftp文件传输的具体 ...

  3. python 实现ftp服务 简介

    目录 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. 搭建FTP服务器的Server端 # -*- codi ...

  4. [源码]python Scapy Ftp密码嗅探

    [源码]python Scapy Ftp密码嗅探 原理很简单,FTP密码明文传输的 截取tcp 21端口User和Pass数据即可 Scapy框架编译程序较大(一个空程序都25M),所以就不提供exe ...

  5. python编写ftp客户端_用Python写FTP客户端程序

    0 前言: ftp客户端相信大家都用过,那么我们为什么还要用Python写ftp客户端呢? 我想有两个原因: 一是写出更好的ftp客户端应用程序,方便大家使用: 二是定制一些特殊服务,例如每天定时下载 ...

  6. python ftp_Python FTP

    python ftp Today we will learn about python ftp operations. FTP is an acronym for File Transfer Prot ...

  7. mac 上传ftp服务器文件大小,mac与windows通过ftp传输文件

    1.两个系统相互传文件,比较通用的方式是用QQ,两台电脑一台各登陆一个qq,发文件就行了,在同一个网段时,qq会自动转换为按局域网的方式传输. 2.本人不愿安装qq,以ftp方式进行传输,先在wndo ...

  8. Python使用FTP上传文件

    Python使用FTP上传文件 本文主要介绍如何使用Python通过FTP上传文件. FTP简介 FTP即文件传输协议(File Transfer Protocol),是用于在网络上进行文件传输的一种 ...

  9. python --搭建FTP服务器

    一.了解FTP服务器 二.利用python搭建FTP服务器 1.安装 pyftpdlib 模块 2.找到pyftpdlib模块源文件所在目录 3.到 pyftpdlib目录下 4. 编写并运行FTP代 ...

最新文章

  1. Hadoop虚拟机的jdk版本和本地eclipse的版本不一致怎么办
  2. Openstack的主要组件
  3. 学历对程序员重要么?
  4. 为 pom.xml 添加组织,法律和开发人员信息
  5. 阿里云加入开放媒体联盟AOM
  6. 魅族魅蓝note3完美开启usb调试模式的经验
  7. Linux下Python3.6安装实践与相关问题解决记录
  8. JS Array 对象常用方法 unshift / push 、shift / pop 、filter() / map()
  9. 华为荣耀magic2手机系统更新鸿蒙,华为荣耀Magic2怎么禁止系统更新功能_如何关闭和禁用系统更新...
  10. SystemTap笔记03 stap的event和handler
  11. 「 Adams 」如何设置积分器与求解器类型
  12. Python学习笔记(4)-文件读取报错
  13. 区块链开发主流编程语言居然是Go语言
  14. js map根据value获取key
  15. linux中运行屏幕分辨率,Linux设置显示器分辨率与刷新率
  16. torch模块常用方法总结
  17. OPA策略引擎用法实战
  18. Numpy基本用法:ndarray的数据类型
  19. 巴菲特给女儿的一生忠告
  20. 一个android工程师写java后台的感受

热门文章

  1. python双柱状图与双折线图_如何绘制双轴柱状图和折线图?
  2. Stata: 交叉验证简介
  3. CSDN会用用我的账号搞事情?
  4. linux find 排除目录,linux find命令忽略目录的查找方法
  5. python 获取硬盘信息失败请谨慎操作_大白菜U盘装系统提示获取硬盘信息失败怎么办?...
  6. java程序员的浪漫代码_程序员的“硬核”浪漫
  7. Siamese Networks 介绍
  8. 健身中谷氨酰胺是干什么的?
  9. 【自动驾驶中的功能开发】
  10. 评测三款功能强大的epub阅读器(windows适用)