基于
服务器端:
import pymysql
import socketserver
import time
import 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:
break
def 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 result
def readfile(filename):
with open(filename,'rb') as f:
data=f.read()
return data
def 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 time
import 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 result
def readfile(filename):
with open(filename,'rb') as f:
data=f.read()
return data
def 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');
文件目录:
实现效果:
1.向服务器端发送文件
2.向服务器端下载本人上传的文件