socket网络编程ftp

#!/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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python类似于java的重写toString方法

python类中的特殊方法: __str__(self)用来重写 people类: class People:所有员工的基类#构造函数def __init__(self, user_id, user_name):self.user_id user_idself.user_name user_name#析构函数def __del__(self):class_name self.__class__.__n…

socket网络编程实现远程备份

#!/usr/bin/env python #-*-coding:utf-8-*- #GUI设计与构建 客户端建立from tkinter import * from tkinter.ttk import * import socket import struct#启动服务 def start(host,port):pass#我的控件 class MyFrame(Frame):def __init__(self,root):super().__init__(root)se…

python正则表达式使用

模板代码: import re #python 自1.5版本增加了re模块,它提供了Perl风格的正则表达式模式 print(re.match(www, www.baidu.com).span()) #在起初位置匹配 line "Cats are smarter than dogs" matchObj re.match( r(.*) are (.*?) .*, line,…

Q-学习,马克尔决策过程:强化学习

马尔可夫决策过程 马尔可夫决策过程是基于马尔可夫过程理论的随机动态系统的最优决策过程。马尔可夫决策过程是序贯决策的主要研究领域。它是马尔可夫过程与确定性的动态规划相结合的产物,故又称马尔可夫型随机动态规划,属于运筹学中数学规划的一个分支…

python对象使用

模板代码: class People:所有员工的基类#构造函数def __init__(self, user_id, user_name):self.user_id user_idself.user_name user_name#析构函数def __del__(self):class_name self.__class__.__name__print(class_name, 销毁)def get_info(self):print(&qu…

机器学习——决策树算法

机器学习——决策树算法原理及案例 标签: 机器学习决策树信息增益基尼指数模型评估 2016-05-04 15:31 43984人阅读 评论(1) 收藏 举报 分类: 机器学习(10) 版权声明:本文为博主原创文章,未经博主允许不…

python运算符重载

重载符模板代码: class Vector:def __init__(self, a, b):self.a aself.b bdef __str__(self):return Vector (%d, %d) % (self.a, self.b)def __add__(self, other):return Vector(self.a other.a, self.b other.b) v1 Vector(2, 10) v2 Vector(5, -2) prin…

机器学习——决策树的实现

#!/usr/bin/env python #-*-coding:utf-8-*- #决策树的建立,训练测试, from sklearn.feature_extraction import DictVectorizer import csv from sklearn import preprocessing from sklearn import tree from sklearn.externals.six import StringIO#读…

python练习代码保存

#codingutf-8 print(中国人) """ Python 保留字:and, exec, not, assert, finally, or, break, for, pass, class, from, print, continue, global, raise, def, if, return, del, import, try, elif, in, while, else, is, with, except, lambda, …

邻近算法(KNN算法)

邻近算法 锁定本词条由“科普中国”百科科学词条编写与应用工作项目 审核 。邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本…

python机器学习常用包下载安装以及使用案例汇总

python安装教程(Windows系统,python3.7为例) https://blog.csdn.net/weixin_40844416/article/details/80889165 在pycharm中切换python版本的方法 https://blog.csdn.net/sgfmby1994/article/details/77876873 Windows下零基础scikit-learn安装(这种方式…

KNN算法的实现

#!/usr/bin/env python #-*-coding:utf-8-*- #knn 的具体实现 import csv import random import math import operator #导入数据集 文件名,split区分那个集 def loadDataset(filename,split,trainintset[],testSet[]):with open(filename,rb) as csvfile:linescsv.…

python机器学习常用包

总结了一些常用的工具: Numpy | 必用的科学计算基础包,底层由C实现,计算速度快。Pandas | 提供了高性能、易用的数据结构及数据分析工具。 seaborn | 数据可视化 NLTK | 自然语言工具包,集成了很多自然语言相关的算法和资源。Sta…

支持向量机(SVM)算法

支持向量机(SVM)算法支持向量机(support vector machine)是一种分类算法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计…

python文件操作以及相对路径和绝对路径问题

绝对路径: PROJECT_ROOT os.path.dirname(os.path.realpath(__file__))#获取项目根目录path os.path.join(PROJECT_ROOT,"data\\edge\\0_fuse.txt") #文件路径edgeMap np.loadtxt(path)相对路径: path "./data/edge/98_fuse.txt&quo…

支持向量机(SVM)的实现

#!/usr/bin/env python #-*-coding:utf-8-*- #支持向量积的使用,建立超平面 from sklearn import svmx[[2,0],[1,1],[2,3]]y[0,0,1] clfsvm.SVC(kernellinear) #kernellinear线性核函数clf.fit(x,y)print(clf)print(clf.support_vectors_) #支持向量 print(clf.supp…

【kaggle入门题一】Titanic: Machine Learning from Disaster

原题: Start here if... Youre new to data science and machine learning, or looking for a simple intro to the Kaggle prediction competitions. Competition Description The sinking of the RMS Titanic is one of the most infamous shipwrecks in hist…

神经网络NN算法

1. 背景: 1.1 以人脑中的神经网络为启发,历史上出现过很多不同版本1.2 最著名的算法是1980年的 backpropagation 2. 多层向前神经网络(Multilayer Feed-Forward Neural Network)2.1 Backpropagation被使用在多层向前神经网络上2.2 多层向前神经网络由以下部分组成&a…

python利用jieba(textRank、TFIDF)提取关键字

from jieba import analyse print("tfidf: ") tfidf analyse.extract_tags text "线程是程序执行时的最小单位,它是进程的一个执行流,\是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\线程间共享进程…