python3实现ftp服务功能(客户端)
作者:想自由 发布时间:2023-05-28 00:36:31
标签:python,ftp
本文实例为大家分享了python3实现ftp服务功能的具体代码,供大家参考,具体内容如下
客户端 main代码:
#Author by Andy
#_*_ coding:utf-8 _*_
'''
This program is used to create a ftp client
'''
import socket,os,json,time,hashlib,sys
class Ftp_client(object):
def __init__(self):
self.client = socket.socket()
def help(self):
msg = '''useage:
ls
pwd
cd dir(example: / .. . /var)
put filename
rm filename
get filename
mkdir directory name
'''
print(msg)
def connect(self,addr,port):
self.client.connect((addr,port))
def auth(self):
m = hashlib.md5()
username = input("请输入用户名:").strip()
m.update(input("请输入密码:").strip().encode())
password = m.hexdigest()
user_info = {
'action':'auth',
'username':username,
'password':password}
self.client.send(json.dumps(user_info).encode('utf-8'))
server_response = self.client.recv(1024).decode()
# print(server_response)
return server_response
def interactive(self):
while True:
msg = input(">>>:").strip()
if not msg:
print("不能发送空内容!")
continue
cmd = msg.split()[0]
if hasattr(self,cmd):
func = getattr(self,cmd)
func(msg)
else:
self.help()
continue
def put(self,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
file_info = {
"action":"put",
"filename":filename,
"size":filesize,
"overriding":'True'
}
self.client.send( json.dumps(file_info).encode('utf-8') )
#防止粘包,等待服务器确认。
request_code = {
'200': 'Ready to recceive data!',
'210': 'Not ready to received data!'
}
server_response = self.client.recv(1024).decode()
if server_response == '200':
f = open(filename,"rb")
send_size = 0
start_time = time.time()
for line in f:
self.client.send(line)
send_size += len(line)
send_percentage = int((send_size / filesize) * 100)
while True:
progress = ('\r已上传%sMB(%s%%)' % (round(send_size / 102400, 2), send_percentage)).encode(
'utf-8')
os.write(1, progress)
sys.stdout.flush()
time.sleep(0.0001)
break
else:
end_time = time.time()
time_use = int(end_time - start_time)
print("\nFile %s has been sent successfully!" % filename)
print('\n平均下载速度%s MB/s' % (round(round(send_size / 102400, 2) / time_use, 2)))
f.close()
else:
print("Sever isn't ready to receive data!")
time.sleep(10)
start_time = time.time()
f = open(filename, "rb")
send_size = 0
for line in f:
self.client.send(line)
send_size += len(line)
# print(send_size)
while True:
send_percentage = int((send_size / filesize) * 100)
progress = ('\r已上传%sMB(%s%%)' % (round(send_size / 102400, 2), send_percentage)).encode(
'utf-8')
os.write(1, progress)
sys.stdout.flush()
# time.sleep(0.0001)
break
else:
end_time = time.time()
time_use = int(end_time - start_time)
print("File %s has been sent successfully!" % filename)
print('\n平均下载速度%s MB/s' % (round(round(send_size / 102400, 2) / time_use, 2)))
f.close()
else:
print("File %s is not exit!" %filename)
else:
self.help()
def ls(self,*args):
cmd_split = args[0].split()
# print(cmd_split)
if len(cmd_split) > 1:
path = cmd_split[1]
elif len(cmd_split) == 1:
path = '.'
request_info = {
'action': 'ls',
'path': path
}
self.client.send(json.dumps(request_info).encode('utf-8'))
sever_response = self.client.recv(1024).decode()
print(sever_response)
def pwd(self,*args):
cmd_split = args[0].split()
if len(cmd_split) == 1:
request_info = {
'action': 'pwd',
}
self.client.send(json.dumps(request_info).encode("utf-8"))
server_response = self.client.recv(1024).decode()
print(server_response)
else:
self.help()
def get(self,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
file_info = {
"action": "get",
"filename": filename,
"overriding": 'True'
}
self.client.send(json.dumps(file_info).encode('utf-8'))
server_response = self.client.recv(1024).decode() #服务器反馈文件是否存在
self.client.send('0'.encode('utf-8'))
if server_response == '0':
file_size = int(self.client.recv(1024).decode())
# print(file_size)
self.client.send('0'.encode('utf-8')) #确认开始传输数据
if os.path.isfile(filename):
filename = filename+'.new'
f = open(filename,'wb')
receive_size = 0
m = hashlib.md5()
start_time = time.time()
while receive_size < file_size:
if file_size - receive_size > 1024: # 还需接收不止1次
size = 1024
else:
size = file_size - receive_size
data = self.client.recv(size)
m.update(data)
receive_size += len(data)
data_percent=int((receive_size / file_size) * 100)
f.write(data)
progress = ('\r已下载%sMB(%s%%)' %(round(receive_size/102400,2),data_percent)).encode('utf-8')
os.write(1,progress)
sys.stdout.flush()
time.sleep(0.0001)
else:
end_time = time.time()
time_use = int(end_time - start_time)
print('\n平均下载速度%s MB/s'%(round(round(receive_size/102400,2)/time_use,2)))
Md5_server = self.client.recv(1024).decode()
Md5_client = m.hexdigest()
print('文件校验中,请稍候...')
time.sleep(0.3)
if Md5_server == Md5_client:
print('文件正常。')
else:
print('文件与服务器MD5值不符,请确认!')
else:
print('File not found!')
client.interactive()
else:
self.help()
def rm(self,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
request_info = {
'action':'rm',
'filename': filename,
'prompt':'Y'
}
self.client.send(json.dumps(request_info).encode("utf-8"))
server_response = self.client.recv(10240).decode()
request_code = {
'0':'confirm to deleted',
'1':'cancel to deleted'
}
if server_response == '0':
confirm = input("请确认是否真的删除该文件:")
if confirm == 'Y' or confirm == 'y':
self.client.send('0'.encode("utf-8"))
print(self.client.recv(1024).decode())
else:
self.client.send('1'.encode("utf-8"))
print(self.client.recv(1024).decode())
else:
print('File not found!')
client.interactive()
else:
self.help()
def cd(self,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
path = cmd_split[1]
elif len(cmd_split) == 1:
path = '.'
request_info = {
'action':'cd',
'path':path
}
self.client.send(json.dumps(request_info).encode("utf-8"))
server_response = self.client.recv(10240).decode()
print(server_response)
def mkdir(self,*args):
request_code = {
'0': 'Directory has been made!',
'1': 'Directory is aleady exist!'
}
cmd_split = args[0].split()
if len(cmd_split) > 1:
dir_name = cmd_split[1]
request_info = {
'action':'mkdir',
'dir_name': dir_name
}
self.client.send(json.dumps(request_info).encode("utf-8"))
server_response = self.client.recv(1024).decode()
if server_response == '0':
print('Directory has been made!')
else:
print('Directory is aleady exist!')
else:
self.help()
# def touch(self,*args):
def run():
client = Ftp_client()
# client.connect('10.1.2.3',6969)
Addr = input("请输入服务器IP:").strip()
Port = int(input("请输入端口号:").strip())
client.connect(Addr,Port)
while True:
if client.auth() == '0':
print("Welcome.....")
client.interactive()
break
else:
print("用户名或密码错误!")
continue
目录结构:
0
投稿
猜你喜欢
- 写在之前我们都知道 Python 中内置了许多标准的数据结构,比如列表,元组,字典等。与此同时标准库还提供了一些额外的数据结构,我们可以基于
- 字符编码,在编程中,是一个让学习者比较郁闷的东西,比如一个str,如果都是英文,好说多了。但恰恰不是如此,中文是我们不得不用的。所以,哪怕是
- 1.配置需要python3.7,Chrome或者Edeg浏览器,Chrome驱动或者Edge驱动#需要配置selenium库,baidu-a
- 开始刷leetcode算法题 今天做的是“买卖股票的最佳时机”题目要求 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计
- 数据库:30万条,有ID列但无主键,在要搜索的“分类”字段上建有非聚集索引过程T-SQL: /* 用户自定义函数:执行时间在115
- <?php $url='test.php?1=1'; $contents="fjka;fjsa;#page#
- 本篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。注意!虽然这是
- 看下面的Java代码,目的是为了当i是3的时候,就不做输出,直接跳到下一个循环。int i = 0; 
- 前不久有个正要毕业的网友给我发邮件,他毕业设计需要实现锁屏的效果,但是他没有能看懂我之前发布的对话框源码,他问能不能把锁屏相关代码说明下,我
- 今天登录社区的时候看到有之前的文章有个留言的评论,说如何统计typecho所有文章的字数,这里分享一下代码。在当前主题的functions.
- 列表(list)和元组(tuple)的一些基础list和tuple都是一个可以放置任意数据类型的有序集合,都是既可以存放数字、字符串、对象等
- 在写完前面“模块化”相关的文章后,感觉试图用“模块化”本身去讲什么是“模块化”真是不容易讲得清。相信大家都多多少少能理解什么是“模块化”,但
- 本文实例为大家分享了bootstrap响应式工具的具体代码,供大家参考,具体内容如下<!DOCTYPE html><htm
- 一、爬取豆瓣热评该程序进行爬取豆瓣热评,将爬取的评论(json文件)保存到与该python文件同一级目录 * 意需要下载这几个库:reques
- li {list-style-image: url(images/disc.gif);}li的这个样式定义是将列表项目使用图片来代替显示的小
- MySQL使用环境变量TMPDIR的值作为保存临时文件的目录的路径名。如果未设置TMPDIR,MySQL将使用系统的默认值,通常为/tmp、
- 在上一篇文章中,简单介绍了下闭包(closure)和原型链,现在继续来研究闭包的内部机制。对了,所有的东西都参考自这篇文章:Javascri
- //冒泡排序func mpSort(array []int) { for i:=0;i<len(array);i++ {
- 在这里奉上源代码,没有做样式处理,不过功能是可以的,希望大家可以和我交流交流!<html> <head>&
- 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,