基於python的ftp(含資料庫、含多執行緒、含socketserver)
直接上程式碼:
伺服器端:
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跟單網 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');
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2749251/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AIGC的“含科量”與“含資量”AIGC
- python使用多執行緒備份資料庫Python執行緒資料庫
- 坑坑坑,刪庫跑路的多種隱含命令
- 基於matlab的車牌識別(含子程式)Matlab
- [高頻面試]解釋執行緒池的各個引數含義面試執行緒
- python多執行緒基礎Python執行緒
- ABAP 資料庫表 Size Category 欄位的準確含義資料庫Go
- Yii2 基於 layui 的 Excel 上傳並匯入資料(含分頁)UIExcel
- ftp多執行緒下載工具FTP執行緒
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- bootstrap含義boot
- instanceof 含義
- 大資料分析有什麼含義大資料
- jmeter 壓測中,執行緒組和併發數的關係,以及 loop 的含義JMeter執行緒OOP
- CAP 定理的含義
- 回表的含義
- 閉包的含義
- [BUG反饋]onethink1.1含1.0 資料庫還原BUG資料庫
- Java servlet執行的完整流程(圖解含原始碼分析)JavaServlet圖解原始碼
- PostgreSQL sharding : citus 系列1 - 多機部署(含OLTP(TPC-B)測試)- 含Citus MX模式...SQL模式
- 【iOS】含tableView的ViewController基類的實現iOSViewController
- MySQL:簡單記錄performance_schema.threads中的3種執行緒ID各自的含義MySqlORMthread執行緒
- 良心帖!看完這篇,你的Python入門基礎就差不多了!(內含資料)Python
- 基於個人理解的springAOP部分原始碼分析,內含較多原始碼,慎入Spring原始碼
- 基於深度學習的時間序列分類[含程式碼]深度學習
- 基於MVC的企業人事管理系統(含原始檔)MVC
- 基於Laravel的國產開源CMS,支援Swoole,含API介面LaravelAPI
- Python 中 key 引數的含義及用法Python
- Python 中 5 種下劃線的含義Python
- Python中key引數的含義及用法Python
- Mysql中備份資料檔案中/*!*/的含義MySql
- 多執行緒系列(1),多執行緒基礎執行緒
- 資料編織:交易資料和分析資料的橋樑【含示例】
- Shell多執行緒備份資料庫的指令碼執行緒資料庫指令碼
- 網上花店論文-基於jsp開發(含原始檔)JS
- url中#(hash)的含義
- Spring中bean的含義SpringBean
- Makefile中:=, =, ?=和+=的含義