python ftp上传文件,python实现ftp文件传输

  python ftp上传文件,python实现ftp文件传输

  用大蟒自己实现文件传输。实际上,在大蟒的ftplib模块中封装了实现文件传送协议传输的功能。但是,为了理解文件传输的结构,我决定自己写。

  客户端可以将文件上传到服务器并下载。

  得到从服务器下载,发布将文件上传到服务器。

  工程主要目录:

  get方法流程图:

  放方法与得到方法大致相同,只是客户端发送文件并由服务器接收

  放方法的流程图:

  客户端代码:# -编码:utf-8 - # # # FTP _ client #创建于2016年12月15日# @作者:黄平毅# #导入选项端口):自我。宿主=宿主自身。port=portdefput)self,msg)3360 # putlock msgiflen(msg)0:remote _ filename=msg[0]#确定文件中是否存在ifos。路径。is file)remote _ filename)3360 file _ size=OS的服务cmd _ msg=文件传输上传文件大小(self.sock.send ) cmd_msg)服务器返回响应反馈=self.sock.recv(1024 ) print -反馈: ,返回反馈3360 的如果反馈开始于(文件传送上传就绪):f=文件)远程文件名,Rb’)send _ size=0 #开始的传输每次在1024中而not file _ size==send _ size 3360 if file _ size-send _ size 1024360 data=f . read(1024)send _ sed ize)send _ size=file _ size-send _ size self。袜子。send)datate)size)send else 3360 print -send file % s % msg)3360 # getret msgiflen(msg)0:remote _ filename=msg[0]#服务器cmd _ msg= file _ transfer get % s %

  反馈:,反馈#如果文件存在,服务器发送文件大小过来如果反馈以(开头文件传输准备好):#文件大小file _ size=int(反馈。split( )[-1])#客户端发送准备接收ack _ msg= file _ transfer get recv ready self。袜子。发送(确认消息)#建立文件f=file( recv \ % s % remote _ filename, wb) #客户端接受#收到的数据和总大小比较recv_size=0 #文件很大,接受不完,开始计数,每次接收1024而非file _ size==recv _ size:if file _ size-recv _ size 1024:data=self。袜子。recv(1024)recv _ size=len(data)#收到的小于1024,实时性不一定是1024 #最后一轮否则:数据=自身。袜子。recv(file _ size-recv _ size)recv _ size=file _ size-recv _ size f . write(data)else:print -recv file % s % remote _ filename f . close()else:print feedback def interactive(self):#客户端交互如果为True:user _ input=raw _ input( FTP _ client:).strip()if len(user _ input)==0:continue cmd=user _ input。split()if has attr(self,cmd[0]):#用反射判断用户是要得到还是放#判断对象是否有cmd[0]方法func=getattr(self,cmd[0])#有则将cmd[0]方法赋值func(cmd[1:])#把后面的参数传给cmd[0]方法,并执行cmd[0]函数否则:#如果是其他命令,就打印错误print \ 033[31;一错误的煤矿管理局用法!\033[0m def连接(自身):#连接self.sock=socket.socket(套接字.AF_INET,插座.SOCK _ STREAM)自我。袜子。连接((自我。主持人,自我。港口))自我。interactive()if _ _ name _ _= _ _ main _ _ :FTP=FTP( localhost ,7126 ) ftp.connect()

  服务器端代码:# -*-编码:utf-8 -*-###套接字_服务器#创建于2016年12月15日# @作者:黄平义##导入SocketServerimport osclass MyTCPHandler(SocketServer .BaseRequestHandler):def handle(self):while True:data=self。请求。第1024号建议.strip()数据=数据。split( )if有attr(self,data[0]): func=getattr(self,data[0]) func(data[1:])#将后面参数传入file _ transfer def file _ transfer(self,msg):if msg[0]= get :print -将文件:%s发送到客户端% msg[1]filename=msg[1]if OS。路径。是文件(文件名):#判断文件存在#如果文件存在,就判断文件大小file_size=os.path.getsize(文件名)#将文件大小发送給客户端ack _ msg= file _ transfer get ready % s % file _ size self。请求。发送(ack _ msg)client _ ack=self。请求。recv(1024)print -客户端确认:,client_ack #如果客户端准备好就开始传输文件如果client _ ack。以( file _ transfer get recv ready ):f=file(文件名,Rb’)send _ size=0 Flag=True while Flag:if send _ size 1024 file _ size:data=f . read(file _ size-send _ size)Flag=False else:data=f . read(1024)send _ size=1024 self .请求。send(data)print -file % s send done- % filename f . close()else:ack _ msg= file _ transfer get 不存在自我。请求。如果msg[0]= put :print -going,则发送(ack _ msg)获取文件名字和大小file _ name=msg[1]file _ size=msg[2]base _ path= D:\ untitled 4 #发送准备好接收的请求ack _ msg= file _ transfer put ready self。请求。send(ack _ msg)recv _ size=0 #上传文件路径拼接文件目录=操作系统。路径。join(base _ path,file_name) f=file(file_dir, wb ) Flag=True while Flag: #未上传完毕,if int(file_size)recv_size: #最多接收1024,可能接收的小于1024数据=自身。请求。recv(1024)recv _ size=len(data)#上传完毕,则退出循环else:recv _ size=0 Flag=False continue #写入文件f .写(数据)打印”上传成功" f . close()if _ _ name _ _= _ _ main _ _ :HOST,PORT=localhost ,7126 server=SocketServer .ThreadingTCPServer((主机,端口),MyTCPHandler)服务器。永远服务()测试效果:

  执行得到操作

  客户端:

  服务器:

  刷新收到文件夹,便可看见测试。文本文件(textfile)

  执行放操作

  客户端:

  服务器:

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: