最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)(案例分析)

 更新時(shí)間:2020年03月20日 08:09:16   作者:我要出家當(dāng)?shù)朗? 
最近做了一個(gè)簡(jiǎn)單的文件傳輸系統(tǒng),基于ftp協(xié)議,使用python語(yǔ)言開發(fā),雖然python里面已經(jīng)有ftplib模塊,可以很容易的實(shí)現(xiàn)ftp服務(wù)器,這篇文章主要介紹了python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)的案例分析,需要的朋友可以參考下

最近做了一個(gè)簡(jiǎn)單的文件傳輸系統(tǒng),基于ftp協(xié)議,使用python語(yǔ)言開發(fā),雖然python里面已經(jīng)有ftplib模塊,可以很容易的實(shí)現(xiàn)ftp服務(wù)器。這次我使用的是socket實(shí)現(xiàn)client與ftp server之間的通訊和文件傳輸,client另起一個(gè)flask服務(wù)器,用于用戶在瀏覽器端的交互。系統(tǒng)實(shí)現(xiàn)的功能有:用戶登錄注冊(cè),用戶查看ftp服務(wù)器端文件和下載上傳刪除操作,支持多進(jìn)程、多用戶。

一,登錄注冊(cè)

         該項(xiàng)目使用的是mongo數(shù)據(jù)庫(kù),其實(shí)用戶登錄注冊(cè)功能很好實(shí)現(xiàn),沒(méi)有什么技術(shù)細(xì)節(jié),這里就略過(guò)了。數(shù)據(jù)庫(kù)管理代碼如下:

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狀態(tài): 1:表示初始狀態(tài),即不存在用戶
      2:表示存在該用戶、密碼不正確
      3:驗(yàn)證成功
  '''
  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

前端注冊(cè)js代碼如下:

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

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

客戶端與服務(wù)器端約定命令格式,服務(wù)器通過(guò)解析客戶端命令來(lái)執(zhí)行操作。

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/'
# 處理僵尸進(jìn)程
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
# 服務(wù)端功能類
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("服務(wù)器文件庫(kù)為空".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("發(fā)送OK")
   self.connfd.send(b'OK')
   time.sleep(0.1)
  # 發(fā)送文件內(nèi)容
  while True:
   data = fd.read(1024)
   if not data:
    time.sleep(0.1)
    self.connfd.send(b'##')
    break
   #print("正在發(fā)送數(shù)據(jù)")
   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')
  # 接收文件內(nèi)容
  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):
  # 創(chuàng)建套接字
  s = self.socket_tcp()
  while True:
   try:
    connfd,addr = s.accept()
   except KeyboardInterrupt:
    sys.exit("服務(wù)器退出")
   except Exception as e:
    print(e)
    continue
   print("Connect from",addr)
   # 創(chuàng)建子進(jìn)程
   pid = os.fork()
   if pid == 0:
    s.close()
    self.do_request(connfd) #處理客戶端具體請(qǐng)求
    os._exit(0)
   else:
    connfd.close()
if __name__ == "__main__":
 server = Server()
 server.run()
client.py
"""
 client.py
"""
import socket
import os,sys
import time
# 服務(wù)器地址
ADDR = ("127.0.0.1",8686)
FILE_PATH = "./clientFiles/"
# 客戶端功能類
class Client(object):
 def __init__(self,account):
  self.sockfd = ""
  self.account = account
 #獲得服務(wù)器文件列表
 def server_list(self):
  ftpServerFiles = []
  self.sockfd.send((self.account+' LIST@# ').encode())
  # 等待回復(fù)
  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:
   # 無(wú)法完成操作
   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('謝謝使用')
 #用戶下載服務(wù)器文件
 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')
   #復(fù)寫
   while True:
    data = self.sockfd.recv(1024)
    if data == b'##':
     #print("##")
     break
    #print("正在寫入數(shù)據(jù)")
    fd.write(data)
   fd.close()
  else:
   print(data)
 #用戶將文件上傳到服務(wù)器文件夾
 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()
  # 發(fā)送文件
  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())
  # 等待回復(fù)
  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):
  # 創(chuàng)建套接字
  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("請(qǐng)輸入正確命令!")
if __name__ == "__main__":
 client = Client("ffy")
 client.run()

運(yùn)行界面:

 

總結(jié) 

到此這篇關(guān)于python實(shí)現(xiàn)ftp文件傳輸系統(tǒng)的文章就介紹到這了,更多相關(guān)python ftp文件傳輸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)aes加密解密多種方法解析

    Python實(shí)現(xiàn)aes加密解密多種方法解析

    這篇文章主要介紹了Python實(shí)現(xiàn)aes加密解密多種方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python通過(guò)yagmail實(shí)現(xiàn)發(fā)送郵件代碼解析

    Python通過(guò)yagmail實(shí)現(xiàn)發(fā)送郵件代碼解析

    這篇文章主要介紹了Python通過(guò)yagmail實(shí)現(xiàn)發(fā)送郵件代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python random模塊(獲取隨機(jī)數(shù))常用方法和使用例子

    Python random模塊(獲取隨機(jī)數(shù))常用方法和使用例子

    這篇文章主要介紹了Python random模塊(獲取隨機(jī)數(shù))常用方法和使用例子,需要的朋友可以參考下
    2014-05-05
  • python?yield迭代器詳解

    python?yield迭代器詳解

    帶有yield的函數(shù)在Python中被稱之為generator(生成器),也就是說(shuō),當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候,函數(shù)內(nèi)部的代碼并不立即執(zhí)行?,這個(gè)函數(shù)只是返回一個(gè)生成器
    2022-11-11
  • Python中作用域的規(guī)則與應(yīng)用

    Python中作用域的規(guī)則與應(yīng)用

    在?Python?編程中,作用域(Scope)?是指一個(gè)變量可以被訪問(wèn)和引用的范圍,這篇文章主要為大家介紹了Python中作用域的規(guī)則與應(yīng)用的相關(guān)知識(shí),需要的可以了解下
    2025-01-01
  • python GUI實(shí)例學(xué)習(xí)

    python GUI實(shí)例學(xué)習(xí)

    給大家介紹一下python GUI實(shí)例學(xué)習(xí)的心得以及實(shí)現(xiàn)的方式,希望能幫助到你。
    2017-11-11
  • Python?Celery定時(shí)任務(wù)詳細(xì)講解

    Python?Celery定時(shí)任務(wù)詳細(xì)講解

    這篇文章主要介紹了Python?Celery定時(shí)任務(wù)詳細(xì)講解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • python?matplotlib庫(kù)繪圖實(shí)戰(zhàn)之繪制散點(diǎn)圖

    python?matplotlib庫(kù)繪圖實(shí)戰(zhàn)之繪制散點(diǎn)圖

    Python有著強(qiáng)大的繪圖庫(kù) matplotlib,該庫(kù)集成了大量的繪制函數(shù),可以滿足我們平時(shí)絕大多數(shù)的繪圖要求,這篇文章主要給大家介紹了關(guān)于python?matplotlib庫(kù)繪圖實(shí)戰(zhàn)之繪制散點(diǎn)圖的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Python圖像處理之圖像與視頻處理基礎(chǔ)教程

    Python圖像處理之圖像與視頻處理基礎(chǔ)教程

    這篇文章主要介紹了Python圖像處理之圖像與視頻處理基礎(chǔ)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Python sklearn中的.fit與.predict的用法說(shuō)明

    Python sklearn中的.fit與.predict的用法說(shuō)明

    這篇文章主要介紹了Python sklearn中的.fit與.predict的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06

最新評(píng)論

乐安县| 永定县| 桃园市| 磴口县| 南靖县| 祁连县| 苍梧县| 武宣县| 长乐市| 乐亭县| 卫辉市| 百色市| 从江县| 周口市| 双江| 临邑县| 山阴县| 濮阳县| 黔东| 准格尔旗| 洛南县| 紫阳县| 太保市| 淮南市| 鞍山市| 包头市| 安庆市| 台北县| 威信县| 巴青县| 锦屏县| 福建省| 米易县| 方城县| 依安县| 新津县| 新竹县| 满洲里市| 朝阳区| 大埔县| 乐都县|