91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何實現ftp文件傳輸系統

發布時間:2021-03-23 10:01:20 來源:億速云 閱讀:144 作者:小新 欄目:開發技術

這篇文章主要介紹了python如何實現ftp文件傳輸系統,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

最近做了一個簡單的文件傳輸系統,基于ftp協議,使用python語言開發,雖然python里面已經有ftplib模塊,可以很容易的實現ftp服務器。這次我使用的是socket實現client與ftp server之間的通訊和文件傳輸,client另起一個flask服務器,用于用戶在瀏覽器端的交互。系統實現的功能有:用戶登錄注冊,用戶查看ftp服務器端文件和下載上傳刪除操作,支持多進程、多用戶。

一,登錄注冊

         該項目使用的是mongo數據庫,其實用戶登錄注冊功能很好實現,沒有什么技術細節,這里就略過了。數據庫管理代碼如下:

import pymongo
from pymongo.collection import Collection
class DBManager(object):
 def __init__(self):
  client = pymongo.MongoClient("mongodb://localhost:27017/")
  self.db = client["FTPDB"]
  self.users = self.db['user']
 #保存用戶登錄信息
 def saveUserInfo(self,account,password):
  users = self.users.find()
  for item in users:
   accountDB = item['account']
   if accountDB == account:
    return "false"
  data = []
  userInfo = {}
  userInfo['account'] = account
  userInfo['password'] = password
  data.append(userInfo)
  collection = Collection(self.db,"user")
  collection.insert(data)
  return "true"
 def confirmUserLoginInfo(self,account,password):
  users = self.users.find()
  '''
   result狀態: 1:表示初始狀態,即不存在用戶
      2:表示存在該用戶、密碼不正確
      3:驗證成功
  '''
  result = 1
  for item in users:
   accountDB = item['account']
   passwordDB = item['password']
   if accountDB == account:
    if passwordDB == password:
     result = 3
    else:
     result = 2
  return result

前端注冊js代碼如下:

function register() {
 account = $("#account").val();
 password = $("#password").val();
 confirmPassword = $("#confirmPassword").val();
 if(account == null || password == null || confirmPassword == null){
  alert("請先輸入必要信息")
  return;
 }
 if(password != confirmPassword){
  alert("密碼不一致");
  return;
 }
 var request = {
  type:"register",
  account:account,
  password:password
 }
 sendData("http://localhost:8080/register",request)
}
//向服務器發送數據
function sendData(url,json) {
 $.ajax({
  url: url, //請求的url地址
  dataType: "json", //返回格式為json
  async: true, //請求是否異步,默認為異步,這也是ajax重要特性
  data: json, //參數值
  type: "post", //請求方式
  success:function(data){
   //alert(data)
   if(data.toString() == "false"){
    alert("用戶名已存在");
   }else{
    window.location.href = "http://localhost:8080/index";
   }
  },
  error:function (error) {
   console.log(error);
  }
 });
}

二,文件管理(文件查看、刪除、上傳、下載)

客戶端與服務器端約定命令格式,服務器通過解析客戶端命令來執行操作。

server.py
from socket import *
import os,sys
import signal
import time
# 全局變量
HOST = '0.0.0.0'
PORT = 8686
ADDR = (HOST,PORT)
FILE_PATH = '../serverFiles/'
# 處理僵尸進程
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
# 服務端功能類
class Server(object):
 def __init__(self):
  self.connfd = ""
 def do_list(self,account):
  # 獲取文件列表
  file_list = os.listdir(FILE_PATH+account)
  if not file_list:
   self.connfd.send("服務器文件庫為空".encode())
   return
  else:
   self.connfd.send(b"OK")
   time.sleep(0.1)
  files = ""
  for file in file_list:
   if file[0] != '.' and os.path.isfile(FILE_PATH + account +"/"+ file):
    files += file + '#'
  self.connfd.send(files.encode())
 def delete(self,accout,fileName):
  os.remove(FILE_PATH + accout + "/" + fileName)
  self.connfd.send(b"OK")
  time.sleep(0.1)
 def do_get(self,account,filename):
  try:
   fd = open(FILE_PATH + account +"/"+ filename,'rb')
  except IOError:
   self.connfd.send("文件不存在".encode())
   return
  else:
   #print("發送OK")
   self.connfd.send(b'OK')
   time.sleep(0.1)
  # 發送文件內容
  while True:
   data = fd.read(1024)
   if not data:
    time.sleep(0.1)
    self.connfd.send(b'##')
    break
   #print("正在發送數據")
   self.connfd.send(data)
  fd.close()
 def do_put(self,account,filename):
  if os.path.exists(FILE_PATH + account +"/"+ filename):
   self.connfd.send('該文件已存在'.encode())
   return
  fd = open(FILE_PATH + account +"/"+ filename,'wb')
  self.connfd.send(b'OK')
  # 接收文件內容
  while True:
   data = self.connfd.recv(1024)
   if data == b'**':
    break
   fd.write(data)
  fd.close()
 def socket_tcp(self):
  s = socket()
  s.setsockopt(SOL_SOCKET,SO_REUSEADDR,True)
  s.bind(ADDR)
  s.listen(5)
  print("Listen the port 8686...")
  return s
 def do_request(self,connfd):
  self.connfd = connfd
  while True:
   data = connfd.recv(1024).decode()
   datas = data.split(' ')
   if not data or datas[1] == 'QUIT@#':
    connfd.close()
    return
   elif datas[1] == "LIST@#":
    #print("list")
    self.do_list(datas[0])
   elif datas[1] == 'GET@#':
    filename = datas[-1]
    self.do_get(datas[0],filename)
   elif datas[1] == 'PUT@#':
    filename = datas[-1]
    self.do_put(datas[0],filename)
   elif datas[1] == 'delete@#':
    filename = datas[-1]
    self.delete(datas[0],filename)
 def run(self):
  # 創建套接字
  s = self.socket_tcp()
  while True:
   try:
    connfd,addr = s.accept()
   except KeyboardInterrupt:
    sys.exit("服務器退出")
   except Exception as e:
    print(e)
    continue
   print("Connect from",addr)
   # 創建子進程
   pid = os.fork()
   if pid == 0:
    s.close()
    self.do_request(connfd) #處理客戶端具體請求
    os._exit(0)
   else:
    connfd.close()
if __name__ == "__main__":
 server = Server()
 server.run()
client.py
"""
 client.py
"""
import socket
import os,sys
import time
# 服務器地址
ADDR = ("127.0.0.1",8686)
FILE_PATH = "./clientFiles/"
# 客戶端功能類
class Client(object):
 def __init__(self,account):
  self.sockfd = ""
  self.account = account
 #獲得服務器文件列表
 def server_list(self):
  ftpServerFiles = []
  self.sockfd.send((self.account+' LIST@# ').encode())
  # 等待回復
  data = self.sockfd.recv(128).decode()
  if data == "OK":
   files = self.sockfd.recv(4096).decode()
   for file in files.split('#'):
    #print(file)
    ftpServerFiles.append(file)
  else:
   # 無法完成操作
   print(data)
  ftpServerFiles = ftpServerFiles[:-1]
  return ftpServerFiles
 #獲得用戶文件夾列表
 def client_list(self):
  # 獲取文件列表
  userFiles = []
  file_list = os.listdir(FILE_PATH+self.account+"/")
  if not file_list:
   return
  else:
   time.sleep(0.1)
  files = ""
  for file in file_list:
   if file[0] != '.' and os.path.isfile(FILE_PATH + self.account + "/" + file):
    userFiles.append(file)
  return userFiles
 #退出
 def do_quit(self):
  self.sockfd.send((self.account+' QUIT@# ').encode())
  self.sockfd.close()
  sys.exit('謝謝使用')
 #用戶下載服務器文件
 def do_get(self,filename):
  self.sockfd.send((self.account+' GET@# '+filename).encode())
  data = self.sockfd.recv(128).decode()
  if data == 'OK':
   fd = open(FILE_PATH + self.account + "/" + filename,'wb')
   #復寫
   while True:
    data = self.sockfd.recv(1024)
    if data == b'##':
     #print("##")
     break
    #print("正在寫入數據")
    fd.write(data)
   fd.close()
  else:
   print(data)
 #用戶將文件上傳到服務器文件夾
 def do_put(self,filename):
  try:
   fd = open(FILE_PATH + self.account + "/" + filename,'rb')
  except IOError:
   print("文件不存在")
   return
  # 獲取文件名
  filename = filename.split('/')[-1]
  # else:
  self.sockfd.send((self.account+' PUT@# '+filename).encode())
  data = self.sockfd.recv(128).decode()
  # 發送文件
  if data == 'OK':
   while True:
    data = fd.read(1024)
    if not data:
     time.sleep(0.1)
     self.sockfd.send(b'**')
     break
    self.sockfd.send(data)
   fd.close()
   return "true"
  else:
   print(data)
   return "false"
 #刪除用戶文件
 def removeU(self,fileName):
  os.remove(FILE_PATH + self.account + "/" + fileName)
  return "true"
 #刪除用戶文件
 def removeF(self,fileName):
  self.sockfd.send((self.account+' delete@# '+fileName).encode())
  # 等待回復
  data = self.sockfd.recv(128).decode()
  if data == "OK":
   return "true"
 def menu_display(self):
  print("\n------命令選擇-------")
  print("*** clist  ***")
  print("*** slist  ***")
  print("*** get list  ***")
  print("*** put list  ***")
  print("*** quit  ***")
  print("----------------------")
 def run(self,cmd):
  # 創建套接字
  sockfd = socket.socket()
  try:
   sockfd.connect(ADDR)
  except Exception as e:
   print(e)
   return
  result = ""
  self.sockfd = sockfd
  # choice(cmd,ftp)
  if cmd == "slist":
   result = self.server_list()
   return result
  elif cmd == "clist":
   result = self.client_list()
   return result
  elif cmd =='quit':
   self.do_quit()
  elif cmd[:3] == 'get':
   filename = cmd.strip().split(' ')[-1]
   self.do_get(filename)
  elif cmd[:3] == 'put':
   filename = cmd.strip().split(' ')[-1]
   result = self.do_put(filename)
   return result
  elif cmd[:7] == 'removeU':
   filename = cmd.strip().split(' ')[-1]
   self.removeU(filename)
  elif cmd[:7] == 'removeF':
   filename = cmd.strip().split(' ')[-1]
   self.removeF(filename)
  else:
   print("請輸入正確命令!")
if __name__ == "__main__":
 client = Client("ffy")
 client.run()

運行界面:

python如何實現ftp文件傳輸系統

python如何實現ftp文件傳輸系統

感謝你能夠認真閱讀完這篇文章,希望小編分享的“python如何實現ftp文件傳輸系統”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宿州市| 若尔盖县| 德钦县| 潼南县| 云林县| 门源| 开平市| 昌平区| 张北县| 米林县| 昌宁县| 榕江县| 金溪县| 玉龙| 罗甸县| 扎兰屯市| 安岳县| 北票市| 新源县| 保靖县| 翁源县| 儋州市| 福泉市| 元谋县| 互助| 隆昌县| 怀柔区| 盐山县| 东辽县| 西宁市| 民和| 枞阳县| 廊坊市| 宁蒗| 惠水县| 英山县| 抚远县| 河东区| 苍梧县| 仙游县| 巴楚县|