#!/usr/bin/env python3
import socket
import os,json,sys
import hashlib
import getpass
import threading
# ftp 客户端
'''
ftp socetserver 状态码
400 用户认证失败
401 命令不正确
402 文件不存在
403 创建文件已经存在
404 磁盘空间不够
405 不续传
200 用户认证成功
201 命令可以执行
202 磁盘空间够用
203 文件具有一致性
205 续传
000 系统交互码
'''
class Myclient(object):
def __init__(self,ip_port):
self.ip_port = ip_port
def help(self):
msg = '''
command:
ls
rm filename
pwd
cd ../.. or filename
get filename
put filename
'''
print(msg)
# 连接server服务器
def connect(self):
self.client = socket.socket()
self.client.connect(self.ip_port)
# 程序开始
def start(self):
self.connect()
while True:
username = input("\033[1;32;1minput user name:\033[0m").strip()
password = getpass.getpass("\033[1;32;1minput your password:\033[0m").strip()
login_info = ("%s:%s"%(username,password))
# 向服务器发送登录信息
# login_info = "huge:123456"
self.client.send(login_info.encode())
# 服务器返回登录状态
status_code = self.client.recv(1024).decode()
if status_code == "400":
print("name or password wrong!!")
continue
else:
print("login success!")
self.interactive()
def interactive(self):
while True:
command = input("\033[1;32;1m->>:\033[0m").strip()
if not command:
continue
# 获取输入命令的首字符串 然后利用反射调用对应的函数执行相应的动作
command_first_str = command.split()[0]
if hasattr(self, command_first_str):
func = getattr(self, command_first_str)
func(command)
else:
print("%s command not exist!"%(command_first_str))
self.help()
def ls(self, *args):
cmd = ''.join(args[0])
msg_dic={
"action":"ls",
"cmd":cmd
}
self.__universal_method_havedata(msg_dic)
def rm(self, *args):
cmd = ''.join(args[0])
msg_dic={
"action":"rm",
"cmd":cmd
}
self.__universal_method_havedata(msg_dic)
def pwd(self, *args):
cmd = ''.join(args[0])
msg_dic={
"action":"pwd",
"cmd":cmd
}
if(len(cmd.split()) ==1):
self.__universal_method_havedata(msg_dic)
else:
print("%s : not exist!"%cmd)
def mkdir(self, *args):
cmd = ''.join(args[0])
msg_dic={
"action":"mkdir",
"cmd":cmd
}
self.__universal_method_nodata(msg_dic)
def cd(self, *args):
cmd = ''.join(args[0])
msg_dic={
"action":"cd",
"cmd":cmd
}
self.__universal_method_nodata(msg_dic)
def get(self, *args):
'''
get命令,默认从用户在server的当前目录下寻找并发送数据
可实现续传
'''
command = args[0].split()
if len(command) >1:
filename = command[1]
client_exist_file = os.path.isfile(filename)
# client和server端命令交互统一以字典的形式 便于扩展
msg_dic={
"action":"get",
"filename":filename,
"client_exist_file":client_exist_file
}
self.client.send(json.dumps(msg_dic).encode())
# 接收server端返回的文件状态(server端是否存在该文件)
status_code = self.client.recv(1024).decode()
# server exist file
if status_code =="201":
# 判断client是否存在文件 是否进行续传
if client_exist_file:
status_code = "205"
get_size = os.stat(filename).st_size
else:
status_code = "405"
get_size = 0
continue_msg={
"status_code":status_code,
"get_size":get_size
}
# 是否续传的信息发送至server,状态 及已经收到的文件大小
self.client.send(json.dumps(continue_msg).encode())
file_size = int(self.client.recv(1024).decode())
if get_size == file_size:
print_strs = "%s already exists!!"%filename
else:
print_strs = "loading over!"
# 以追加的方式打开文件,即可实现续传
f = open(filename, "ab")
while get_size< file_size:
if file_size - get_size>1024:
size = 1024
else:
size = file_size- get_size
data = self.client.recv(size)
f.write(data)
get_size +=len(data)
self.__progress(get_size, file_size, "loading.........")
print(print_strs)
f.close()
else:
print("%s not exist!"%filename)
else:
print("%s not right!"%command)
self.help()
def put(self, *args):
'''
put文件上传命令,上传的文件默认保存到用户在server上的self.current_path当前目录下
md5进行文件是否一致校验
'''
command = args[0].split()
if len(command)>1:
filename = command[1]
# print("os path******:",os.path)
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
base_filename = os.path.basename(filename)
msg_dic = {
"action":"put",
"filename":base_filename,
"filesize":filesize,
"overridden":True
}
# 将信息转化成json格式 发送
self.client.send(json.dumps(msg_dic).encode())
# print("client send:",json.dumps(msg_dic).encode())
# 接收server返回的磁盘空间状态
status_code = self.client.recv(1024).decode()
# server返回 202 磁盘空间够用 即可发送文件
if status_code =="202":
self.client.send("000".encode())
send_size = int(self.client.recv(1024).decode())
if send_size == filesize:
print_strs = "Server has already been in file %s [filename] !"%filename
else:
print_strs = "upload over"
m = hashlib.md5()
f = open(filename,"rb")
f.seek(send_size)
for line in f:
m.update(line)
send_size = f.tell()
self.client.send(line)
# 显示进度条
self.__progress(send_size, filesize, "uploading.....")
print(print_strs)
f.close()
self.client.send(m.hexdigest().encode())
status_code = self.client.recv(1024).decode()
if status_code == "203":
print("\nThe FtpServer get the same file")
else:
print("\nThe FtpServer not get the same file!!")
else:
print("\nThe FtpServer diskfull!")
else:
print("%s not exist !"%(filename))
else:
print("[401] %s er
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【作品名称】:基于python开发一个支持多用户在线的FTP程序 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 功能实现 1、conf目录下settings.py模块记录可操作用户信息,根据用户信息生成用户字典和宿主目录。目前只是用文件的形式存储信息 暂时没有使用数据库 2、每个用户的宿主目录磁盘空间配额默认为10M,可在settings.py模块里进行修改 3、程序运行在linux python3.x系统上,命令操作: 1)切换目录:cd .. cd ../../返回上一/两级目录 cd dirname 进入dirname 用户登录后默认进入宿主目录,只可在“宿主目录”下随意切换 2)创建目录:mkdir dirname 在当前目录下创建目录,如果目录存在则报错,不存在创建 3)查看当前路径: pwd 4)查
资源推荐
资源详情
资源评论
收起资源包目录
基于python开发一个支持多用户在线的FTP程序.zip (27个子文件)
基于python开发一个支持多用户在线的FTP程序
.DS_Store 6KB
README 3KB
ftp_server
__init__.py 0B
main.py 1KB
core
__init__.py 0B
server.py 9KB
user_verify.py 905B
__pycache__
user_Authentication.cpython-34.pyc 864B
user_verify.cpython-34.pyc 1KB
server.cpython-34.pyc 4KB
__init__.cpython-34.pyc 156B
user_verify.cpython-35.pyc 1KB
__init__.cpython-35.pyc 156B
userverify.cpython-34.pyc 1KB
server.cpython-35.pyc 7KB
userdb
huge3.db 186B
huge.db 184B
huge2.db 186B
conf
__init__.py 0B
setting.py 402B
__pycache__
setting.cpython-34.pyc 542B
setting.cpython-35.pyc 570B
__init__.cpython-34.pyc 167B
__init__.cpython-35.pyc 156B
log
__init__.py 0B
ftp_client
__init__.py 0B
client.py 10KB
共 27 条
- 1
资源评论
MarcoPage
- 粉丝: 4247
- 资源: 8839
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功