#!/usr/bin/env python
#-*-coding:utf-8-*-
#ftp客户端
import os
import socket
import threading
import socketserver#下载文件
def get_file(host,port,filepath):s=socket.socket()s.connect((host,port))filepath=os.path.join('.','bakc','filepath')f=open(filepath,'wb')data=Truewhile data:data=s.recv(1024)if data:f.write(data)s.close()f.close()#上传文件
def put_file(host,port,filepath):s=socket.socket()s.connect((host,port))f=open(filepath,'rb')while True:data=f.read(1024)if data:s.sendall(data)else:breaks.close()f.close()class FtpClient:def __init__(self,host='localhost',port=21):self.host=hostself.port=portself.cmds=('QUIT','USER','NOOP','TYPE','PASV','PORT','RETR','STOR')self.linesep='\n'self.data_port=Noneself.loged=Falseself.sock=Noneself.pasv_mode=Noneself.pasv_host=Noneself.pasv_port=Nonedef cmd_connect(self):self.sock=socket.socket()self.sock.connect((self.host,self.port))self.data_port=self.sock.getsockname()[0]def start(self):print('支持的命令: ',self.cmds)self.cmd_connect()self.login()while True:cmd=input('请输入FTP命令: ')if not cmd:print('FTP命令不能为空')continuecmd,args=self.split_args(cmd)if not self.send_cmd(cmd,args):continueres=self.readline(self.sock)print(res)if cmd.startswith('PASV') and res.startswith('227'):self.pasv_mode=Trueservinfo=res[res.index('(')+1:res.index(')')]self.pasv_host='.'.join(servinfo.split(',')[:4])servinfo=servinfo.split(',')[-2:]self.pasv_port=256*int(servinfo[0])+int(servinfo[1])if cmd.startswith('RETR'):if self.pasv_mode:threading.Thread(target=get_file,args=(self.pasv_host,self.pasv_port,args)).start()if cmd.startswitch('STOR'):if self.pasv_mode:threading.Thread(target=put_file,args=(self.pasv_host,self.pasv_port,args)).start()if cmd.startswitch('QUIT'):breakself.sock.close()self.sock=Nonedef login(self):if self.sock:self.send_cmd('USER')res=self.readline(self.sock)if res.startswitch('230'):print('登录成功!')self.loged=Truedef readline(self,sock):data=''while not data.endswith(self.linesep):d=sock.recv(1)data+=d.decode('utf-8')return datadef split_args(self,cmds):if ' ' in cmds:cmdlsts=cmds.split(' ')cmd=cmdlsts[0]args=' '.join(cmdlists[1:])else:cmd=cmdsargs=''return cmd.upper(),argsdef send_cmd(self,cmd,args=''):if self.sock:if args:cmd=' '.join((cmd,args))if cmd.startswith('RETR') or cmd.startswith('STOR'):if self.pasv_mode is None:print('Please appoint port or stor mode.')return Falseif not args:return Falseif cmd.startswith('STOR'):if args:if not os.path.exists(args):print('File is not exists')return Falsecmd+=self.linesepsself.sock.sendall(cmd.encode('utf-8'))return Trueif __name__=='__main__':fc=FtpClient()fc.start()#!/usr/bin/env python
#-*-coding:utf-8-*-
#ftp服务器的定义
import  socket
import socketserver
import time
import threading
import osclass FTPHdl(socketserver.StreamRequestHandler):def __init__(self,request=None,client_address=None,server=None):#实例属性,所有命令self.coms_keys=('QUIT','USER','NOOP','TYPE','PASV','PORT','RETR','STOR')#命令与方法映射self.coms={}self.init_coms()self.server=server#命令端口self.cmd_port=21#数据端口self.data_port=20self.pasv_data_ip=Noneself.pasv_data_port=None#参数self.args=None#是否登入self.loged=False#主动模式,被动模式self.pasv_mode=Nonesuper().__init__(request,client_address,server)#初始话所有命令def init_coms(self):for k in self.coms_keys:self.coms[k]=getattr(self,'exe_'+k.lower())#客户端处理def handle(self):while True:#获得命令cmds=self.rfile.readline()if not cmds:continuecmds=cmds.decode('utf-8')#命令分析cmd=self.deal_args(cmds)#命令动词if cmd in self.coms_keys:self.coms.get(cmd)()#不在定义的命令之内else:self.send(500,'Invaild command.')if cmd=='QUIT':break#处理命令行def deal_args(self,cmds):#命令动词,命令参数分割if ' ' in cmds:cmd,args=cmds.aplit(' ')args=args.strip('\n').strip()#只有命令动词else:cmd=cmds.strip('\n')args=''#参数为空if args:self.args=args#返回命令动词return cmd.upper()#用户退出def exe_quit(self):self.send(221,'bye')#用户登入def exe_user(self):user=self.args#用户名为空或默认if user in ('','anonymous'):user='anonymous'self.loged=True#登入已经self.send(230,'identified!')#没有登入,匿名else:self.send(530,'Only use anonymous')#被动模式def exe_pasv(self):if not self.loged:#要求登入self.send(332,'Please login.')return #已经进入被动模式if self.pasv_mode:#发送用户信息。IP端口号发送客户端info='entering passive mode (%s)' % self.make_pasv_info()self.send(227,info)returntry:#进入被动模式self.enter_pasv()info='entering passive mode (%s)' % self.make_pasv_info()self.pasv_mode=Trueself.send(227,info)except Exception as e:print(e)self.send(500,'Failure change to passive mode.')#被动模式下数据连接服务器的地址和端口def make_pasv_info(self):ip_info=self.pasv_data_ip.split('.')ip_info=','.join(ip_info)porta=str(self.pasv_data_port // 256)portb=str(self.pasv_data_port % 256)return ','.join((ip_info,porta,portb))#进入被动模式def enter_pasv(self):if self.server.data_server is None:self.pasv_data_ip,self.pasv_data_port=self.server.create_data_server()#进入主动模式def exe_port(self):self.send(500,'Do not offer port mode.')def exe_noop(self):self.send(200,'ok')def exe_type(self):self.send(200,'ok')#下载文件def exe_retr(self):if not os.path.exists(self.args):self.send(550,'File is not exists.')returnclient_addr=self.request.getpeername()[0]#获得ip地址self.add_opr_file(client_addr,('RETR',self.args))self.send(150,'ok.')#上传文件def exe_stor(self):client_addr=self.request.getpeername()[0]self.add_opr_file(client_addr,('STOR',self.args))self.send(150,'ok.')def add_opr_file(self,client_addr,item):if client_addr in DataHdl.client_opr:DataHdl.client_opr[client_addr].append(item)else:DataHdl.client_opr[client_addr]=[item,]def send(self,code,info):infos='%d %s\n' % (code,info)self.request.sendall(infos.encode('utf-8'))class MyThrTCPServ(socketserver.ThreadingTCPServer):def __init__(self,addr,Hdl):self.data_server=Nonesuper().__init__(addr,Hdl)def shutdown(self):if self.data_server:threading.Thread(target=self.data_server.shutdown).start()super().shutdown()def create_data_server(self):self.data_server=socketserver.ThreadingTCPServer(('127.0.0.1',0),DataHdl)pasv_data_ip,pasv_data_port=self.data_server.server_addressthreading.Thread(target=self.data_server.serve_forever).start()return pasv_data_ip,pasv_data_portclass DataHdl(socketserver.StreamRequestHandler):client_opr={}def handle(self):peerip=self.request.getpeername()[0]opr=self.get_opr_args(peerip)if opr:if opr[0]=='RETR':#下载文件self.retr_file(opr[1])elif opr[0]=='STOR':#上传文件self.stor_file(opr[1])def get_opr_args(self,peerip):if peerip in self.client_opr:opr=self.client_opr[peerip]if not self.client_opr[peerip]:self.client_opr.pop(peerip)return opr#发送文件def retr_file(self,filepath):f=open(filepath,'rb')while True:data=f.read(1024)if data:self.request.sendall(data)else:breakf.close()#接受文件def stor_file(self,filepath):f=open(os.path.join('.','bakt',filepath),'wb')while True:data=self.request.recv(1024)if data:f.write(data)else:breakf.close()if __name__=='__main__':server=MyThrTCPServ(('127.0.0.1',21),FTPHdl)threading.Thread(target=server.serve_forever).start()print('FTP start...')time.sleep(30)server.shutdown()

socket网络编程ftp相关推荐

  1. Socket网络编程笔记

    网络.计算机网络的构成是什么? 网络: 在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它可以把各个点.面(组织之间).体(例如公共app)的信息联系到一起,从而实现这些资源的共享. 局域网 ...

  2. Socket网络编程(TCP/IP/端口/类)和实例

    原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Ap ...

  3. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  4. 看完之后保证你对socket编程步骤胸有成竹。 C++ Socket网络编程基础详解(TCP)

    C++ Socket网络编程基础详解(TCP版) ​    网络编程,就是编写程序使得两台计算机交换数据,其实从本质上来讲,网络编程最终所实现的功能,和我们文件的输入输出很相似,只是文件输入输出的对象 ...

  5. Windows Socket 网络编程(一)

    **来源:http://www.vckbase.com/document/viewdoc/?id=472 Windows Socket 网络编程(一)** -- TCP/IP体系结构.特点及相关术语 ...

  6. 【socket】C语言的Socket网络编程

    目录 Socket网络编程 1.网络知识 网络中进程之间如何通信? 什么是Socket? socket一词的起源 怎么理解端口? 怎么理解socket ? 2. 客户/服务器模式 2.1 服务器端: ...

  7. Linux 网络编程——socket 网络编程

    文章目录 一.网络基础 TCP/UDP对比 TCP/IP协议族体系 socket IP地址 IP地址转化API inet_addr() inet_aton() inet_ntoa() inet_pto ...

  8. Socket网络编程(代码实现)

    Socket网络编程主要分为UDP协议编程和TCP协议编程,下面将会从网络编程概述.UDP编程代码实现和TCP编程代码实现三个方面来全面介绍Socket网络编程. 1.网络编程概述 (1)软件编程2种 ...

  9. Linux C++/Java/Web/OC Socket网络编程

    一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...

最新文章

  1. 从零搭建一套结构光3D重建系统[理论+源码+实践]
  2. 表操作,数据操作,单表查询,python操作数据库
  3. 浙江金华暂时停用“智能头箍”,专家:监测学生脑电违反伦理
  4. 今日逢君君不识下一句
  5. 马化腾:整天在拍拍网上买东西,找感觉
  6. verilog 中生成块的相关知识
  7. python3.6爬淘宝信息
  8. C#使用NOPI导入Excel
  9. oracle混音插件教程,编辑推荐:7款人声混音插件
  10. Adobe Photoshop CS5 12.0 Extend 绿色免安装版
  11. 云计算、分布式计算和网格计算,主要有什么区别,基本概念是什么?
  12. 盘点2017企业服务领域最受关注的100家厂商(BPM平台篇)
  13. 2022-2028全球踏步机测力计行业调研及趋势分析报告
  14. 基于SSM的婚纱影楼系统
  15. export default (imported as router) was not found_开关插座IEC/EN/AS/NZS澳洲SAA认证
  16. 计算机架构总结笔记(1)
  17. 与电容有关的几个经典电路--微分、积分、采样与电荷泵
  18. 日记500字初中计算机课,日记500字初中日常生活
  19. 第一篇文章,我想记录一点小小的成就感
  20. sql注入原理及解决办法

热门文章

  1. 现代软件工程讲义 0 课程概述
  2. java steam 去重_Java中对List去重, Stream去重
  3. 卸载后以前拍的视频会删除吗_可立拍!苹果自己的视频编辑App是一个被忽视的好工具...
  4. JAVA进阶教学之(IO流)
  5. 计算机科学系小学教育专业就业前景,小学教育专业就业方向与就业前景
  6. python的类方法_python 类不实例化,调用类方法:@staticmethod 和 @classmethod
  7. 自动补足算法是什么_数据、算法岗的几点经验分享!
  8. Java中高效判断数组中是否包含某个元素
  9. python正则表达式生成器_Python学习之路-装饰器生成器正则表达式
  10. simulink仿真及代码生成技术入门到精通_Simulink仿真零基础入门到精通实用教学教程 自学全套...