直接上代码:
服务器端:
import pymysqlimport socketserverimport timeimport os
xieyi='''
+----------------------+
1. 想服务器端上传文件
2. 从服务器端下载文件
+----------------------+
'''
login='''
+----------------------+
+ 身份验证 +
+ 请输入用户名和密码: +
+----------------------+
'''
# 实例化 class MyTCPhandler(socketserver.BaseRequestHandler):
def handle(self):
try:
conn = pymysql.connect(
host='localhost',
user='root',
password='cl19970312',
db='ftp',
charset='utf8',
)
except pymysql.Error as e:
print(" 数据库连接失败 ", e)
exit()
finally:
root_path = 'E:\ 堡垒机开发 \server//'
print(" 数据库连接成功 ")
self.cur = conn.cursor()
while True:
try:
self.login_yanzheng = False
self.data=self.request.recv(1024)
print('{}:{}wrote:'.format(self.client_address[0],self.client_address[1]))
print("data:",self.data.decode('utf-8'))
if check_connect(self.data,self.cur):
print(" 登陆成功 ")
id=check_connect(self.data,self.cur)
self.login_yanzheng=True
self.request.send(" 登陆成功 ".encode('utf-8'))
if self.request.recv(1024).decode('utf-8')=='1':
print(" 准备接收文件 ")
self.request.send("OK".encode('utf-8'))
data=self.request.recv(10000000)
save_data(data,id,self.cur)
self.request.close()
conn.commit()
else:
print(" 准备向客户端传送文件 ")
data=query(id,self.cur)
if not data:
self.request.send(" 未找到您的上传记录 ".encode('utf-8'))
print(" 与 {} 断开连接 ".format(self.client_address[0]))
self.request.close()
else:
self.request.send(data.encode('utf-8'))
request=self.request.recv(1024).decode('utf-8')
if isfile(root_path+request+'.jpg'):
data=readfile(root_path+request+'.jpg')
self.request.send(data)
else:
self.request.send('')
else:
print(" 登陆失败 ")
self.login_yanzheng=False
self.request.send(" 登陆失败,用户名不存在 ".encode('utf-8'))
except ConnectionError as e:
print(e)
break
except:
breakdef check_connect(data,cur):
data=data.decode('utf-8').split()
id,password=data[0],data[1]
sql='select * from user where id={};'.format(id)
cur.execute(sql)
results=cur.fetchall()
if results[0][0]==id and results[0][1]==password:
return id
else:
return None
def isfile(filename):
result=os.path.exists(filename)
return resultdef readfile(filename):
with open(filename,'rb') as f:
data=f.read()
return datadef save_data(data,id,cur):
today_now = time.strftime('%Y%m%d%H%M%S')
filename=id+today_now+'.jpg'
root_path='E:\ 堡垒机开发 \server//'
#os.makedirs(root_path)
with open(root_path+filename,'wb') as f:
f.write(data)
sql='insert into file values("{}","{}");'.format(id,filename.split('.')[0])
print(sql)
cur.execute(sql)
print(" 文件上传成功,共 {} 字节 ".format(len(data)))
def query(id,cur):
try:
sql='select filename from file where id="{}";'.format(id)
cur.execute(sql)
results=cur.fetchall()
data=''
for result in results:
data+=str(result)+','
return data
except pymysql.Error as e:
print(e)
return None
if __name__=='__main__':
HOST,PORT='localhost',8080
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPhandler)
server.serve_forever()
客户端:
from socket import *import timeimport os
client=socket()
client.connect(('localhost',8080))
xieyi='''
+----------------------+
1. 想服务器端上传文件
2. 从服务器端下载文件
+----------------------+
'''
login='''
+----------------------+
+ 身份验证 +
+ 请输入用户名和密码: +
+----------------------+
'''def handle_data():
is_quit = False
while True:
if is_quit:
break
send_mas = input(xieyi).strip()
if send_mas in ['1','2']:
if send_mas=="1":
client.send(send_mas.encode('utf-8'))
if client.recv(1024).decode('utf-8')=='OK':
while True:
filename=input(" 请输入文件名: ").strip()
root_path ='E:\ 堡垒机开发 \client//'
print(root_path+filename)
if isfile(root_path+filename):
print(" 文件存在 ")
client.send(readfile(root_path+filename))
print(" 文件发送成功,共 {} 字节 ".format(len(readfile(root_path+filename))))
is_quit=True
exit()
break
else:
print(" 文件不存在 ")
continue
else:
break
else:
client.send(send_mas.encode('utf-8'))
data=client.recv(1024)
if data==' 未找到您的上传记录 ':
print(" 未找到上传记录 ")
client.close()
else:
print(" 一共有以下文件可以下载 ")
print(data.decode('utf-8'))
data=input(" 请输入您选择的文件 >>").strip()
client.send(data.encode('utf-8'))
data=client.recv(1000000)
if data:
save_file(data)
break
else:
print(" 文件被删除 ")
else:
print(" 输入错误,请重新输入 ")def isfile(filename):
result=os.path.exists(filename)
return res跟单网https://www.gendan5.com/ultdef readfile(filename):
with open(filename,'rb') as f:
data=f.read()
return datadef main():
print(login)
send_mas = input(">>").strip()
client.send(send_mas.encode('utf-8'))
recv_data = client.recv(1024)
if recv_data.decode('utf-8') == ' 登陆成功 ':
print(" 服务端允许获得连接 ")
handle_data()
else:
print(" 服务器端不允许获得连接 ")def save_file(data):
today_now = time.strftime('%Y%m%d%H%M%S')
filename =today_now + '.jpg'
root_path = 'E:\ 堡垒机开发 \client//'
# os.makedirs(root_path)
with open(root_path + filename, 'wb') as f:
f.write(data)
print(" 文件保存成功 ! 共 {} 字节 ".format(len(data)))
if __name__=='__main__':
main()
readme:
ftp:
身份验证:
成功:
上传文件
保存文件(server )
下载文件
保存文件(client )
失败:
退出
mysql:
打开命令行输入
mysql -u root -p→
→password→
show databases;
create database ftp;
use ftp;
create table user(id varchar(40) primary key,
password varchar(40));
insert into user value('000001','123456'),('000002','123456'),('000003','654321');