基於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 單例模式(含執行緒鎖關鍵字)單例模式執行緒
- 關於執行計劃中的%CPU的含義
- AIGC的“含科量”與“含資量”AIGC
- FTP命令詳解(含操作例項)FTP
- 大資料之MySQL基礎(含Linux)大資料MySqlLinux
- 執行計劃中cost, card的含義
- 坑坑坑,刪庫跑路的多種隱含命令
- [高頻面試]解釋執行緒池的各個引數含義面試執行緒
- python使用多執行緒備份資料庫Python執行緒資料庫
- 查詢資料庫隱含引數的sql語句資料庫SQL
- 根下的資料夾的含義(轉)
- rhel5 執行who -r的結果含義
- 基於matlab的車牌識別(含子程式)Matlab
- 黑客的含義黑客
- ITL的含義
- Promise的含義Promise
- Yii2 基於 layui 的 Excel 上傳並匯入資料(含分頁)UIExcel
- 基於python的多執行緒暴破指令碼Python執行緒指令碼
- /proc/loadavg 各項資料的含義
- ABAP 資料庫表 Size Category 欄位的準確含義資料庫Go
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- bootstrap含義boot
- 求助!關於多執行緒連線資料庫的問題執行緒資料庫
- 大資料分析有什麼含義大資料
- 大資料含義之大多樣性大資料
- python多執行緒基礎Python執行緒
- ftp多執行緒下載工具FTP執行緒
- 基於Laravel的國產開源CMS,支援Swoole,含API介面LaravelAPI
- 關於 Python 多執行緒/多程式Python執行緒
- co 函式庫的含義和用法函式
- jmeter 壓測中,執行緒組和併發數的關係,以及 loop 的含義JMeter執行緒OOP
- [STAThread]的含義thread
- restrict session的含義RESTSession
- 關於Python多執行緒的理解Python執行緒
- 含read only表空間的資料庫的控制檔案重建資料庫
- Java servlet執行的完整流程(圖解含原始碼分析)JavaServlet圖解原始碼
- Oracle 執行計劃中一些引數的含義Oracle
- 基於個人理解的springAOP部分原始碼分析,內含較多原始碼,慎入Spring原始碼