欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python模擬FTP文件服務(wù)器的操作方法

 更新時(shí)間:2020年02月18日 15:41:30   作者:Rookie_Max  
這篇文章主要介紹了Python_模擬FTP文件服務(wù)器的操作方法,分為服務(wù)端和客戶端,要求可以有多個(gè)客戶端同時(shí)操作。本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

分為服務(wù)端和客戶端,要求可以有多個(gè)客戶端同時(shí)操作。

客戶端可以查看服務(wù)器文件庫中有什么文件。
客戶端可以從文件庫中下載文件到本地。
客戶端可以上傳一個(gè)本地文件到文件庫。
使用print在客戶端打印命令輸入提示,引導(dǎo)操作

服務(wù)端

# 導(dǎo)入相關(guān)模塊
from socket import *
from multiprocessing import Process
import signal, os, time
# 綁定IP地址
IP = "127.0.0.1"
# 綁定端口
PORT = 8888
ADDR = (IP, PORT)
# 綁定服務(wù)器的指定目錄
DIR = "/home/max/ftp"
# 處理查看文件請求
def browse(c):
 # 列表方式查看文件
 list = os.listdir("%s" % DIR)
 # 按通信協(xié)議格式組織數(shù)據(jù)
 msg = "B " + ";".join(list)
 # 發(fā)送到客戶端
 c.send(msg.encode())
# 處理客戶端下載文件請求
def download(c, file):
 # 判斷文件是否存在且是否是文件
 if file in os.listdir(DIR) and os.path.isfile("%s/%s" % (DIR, file)):
  # 打開文件
  f = open("%s/%s" % (DIR, file), "rb")
  # 發(fā)送下載代碼,告知客戶端進(jìn)入"D"
  c.send(("D %s " % file).encode())
  # 等待客戶端先進(jìn)入"D"模式下的recv阻塞函數(shù)
  time.sleep(0.1)
  # 循環(huán)發(fā)送文件
  while True:
   data = f.read(1000)
   if not data:
    # 設(shè)置間隔,等待文件傳輸完整
    time.sleep(0.1)
    # 約定的信息讓客戶端退出接收循環(huán)
    c.send(b"finished")
    break
   c.send(data)
  f.close()
 # 否則按協(xié)議格式發(fā)送錯誤代碼
 else:
  c.send(b"D fileerror ")
# 處理客戶端上傳文件請求
def upload(c, file):
 # 創(chuàng)建文件
 f = open("%s/%s" % (DIR, file), "wb")
 # 循環(huán)接收文件
 while True:
  data = c.recv(1024)
  # 收到約定的信息退出循環(huán)
  if data == b"finished":
   break
  f.write(data)
 f.close()
# 處理客戶端退出請求
def login_out(c):
 # 按協(xié)議格式組織信息
 msg = "O closed "
 # 發(fā)給客戶端的recv_msg進(jìn)程
 c.send(msg.encode())
def deal(c):
 # 發(fā)送代碼告知客戶端連接成功
 c.send(b"K ")
 while True:
  # 循環(huán)接收客戶端請求,約定通信協(xié)議為"* ** ****"格式
  msg = c.recv(1024)
  # 如果客戶端崩了,解除該子進(jìn)程
  if not msg:
   break
  # 解析請求
  req = msg.decode().split(" ", 2)
  # 處理查看文件請求,跳入browse函數(shù)
  if req[0] == "B":
   browse(c)
  # 處理客戶端下載文件請求,跳入download函數(shù)
  elif req[0] == "D":
   download(c, req[1])
  # 處理客戶端上傳文件請求,跳入upload函數(shù)
  elif req[0] == "U":
   upload(c, req[1])
  # 處理客戶端退出請求,跳入login_out函數(shù)
  elif req[0] == "O":
   login_out(c)
   # 跳出循環(huán),結(jié)束子進(jìn)程
   break
# 主程序,父進(jìn)程用于接收客戶端請求并循環(huán)創(chuàng)建子進(jìn)程,子程序處理請求
def main():
 # 創(chuàng)建tcp套接字
 s = socket()
 # 綁定服務(wù)器地址
 s.bind(ADDR)
 # 設(shè)置監(jiān)聽套接字
 s.listen()
 # 處理僵尸進(jìn)程
 signal.signal(signal.SIGCHLD, signal.SIG_IGN)
 while True:
  # 連接客戶端
  c, addr = s.accept()
  # 創(chuàng)建子進(jìn)程,用以處理客戶端請求,跳入deal函數(shù)
  p = Process(target=deal, args=(c,))
  # 子程序開始執(zhí)行
  p.start()
if __name__ == '__main__':
 main()

客戶端

# 導(dǎo)入相關(guān)模塊
from socket import *
import os, sys, time
# 綁定服務(wù)端IP地址
IP = "127.0.0.1"
# 綁定服務(wù)端端口
PORT = 8888
ADDR = (IP, PORT)
# 收到約定的信息退出循環(huán)
# 發(fā)送消息進(jìn)程
def send_msg(s):
 # 等待接收進(jìn)程先運(yùn)行到"K"分支
 time.sleep(0.1)
 while True:
  try:
   # 輸入指令
   data = input(">>>")
  except:
   # 客戶端錯誤,向服務(wù)端發(fā)送O
   data = "O"
  if data == "B": # 查看目錄
   msg = "B "
   s.send(msg.encode())
  elif data == "D": # 下載文件
   # 輸入想要下載的文件
   want = input("download ? file:")
   msg = "D %s " % want
   s.send(msg.encode())
  elif data == "U": # 上傳文件
   file = input("upload ? file:")
   # 判斷文件是否在客戶端文件所在的目錄且是文件
   if file in os.listdir(os.getcwd()) and os.path.isfile("%s/%s" % (os.getcwd(), file)):
    msg = "U %s " % file
    s.send(msg.encode())
    f = open("%s" % file, "rb")
    # 等待服務(wù)端進(jìn)入upload的recv阻塞函數(shù)
    time.sleep(0.1)
    while True:
     data = f.read(1000)
     if not data:
      # 設(shè)置間隔,等待文件傳輸完整
      time.sleep(0.1)
      # 約定的信息讓客戶端退出接收循環(huán)
      s.send(b"finished")
      break
     s.send(data)
    f.close()
    print("upload succussfully")
   # 否則按協(xié)議格式顯示錯誤代碼
   else:
    print("file not exist\ninput BDUO to forward\n", end="")
  elif data == "O": # 斷開連接
   msg = "O "
   s.send(msg.encode())
   sys.exit()
  # 指令錯誤
  else:
   print("input error")

# 接收消息進(jìn)程
def recv_msg(s):
 while True:
  data = s.recv(1024)
  # 解析數(shù)據(jù)
  msg = data.decode().split(" ", 2)
  if msg[0] == "K": # 登錄成功反饋
   print(
    "login in successfully\ninput B to browse,D to download,U to upload,O to login out")
  elif msg[0] == "B": # 查看目錄反饋
   # 如果文件庫不為空
   if msg[2]:
    print("files:", msg[2], "\n>>>", end="")
   else:
    print("files: no files", "\n>>>", end="")
  elif msg[0] == "D":
   # 服務(wù)端文件不存在
   if msg[1] == "fileerror":
    print("file not exist\ninput BDUO to forward\n>>>", end="")
    continue
   # 服務(wù)端文件存在
   else:
    f = open("%s" % msg[1], "wb")
    while True:
     data = s.recv(1024)
     # 收到約定的信息退出循環(huán)
     if data == b"finished":
      break
     f.write(data)
    f.close()
    print("download successfully\n>>>", end="")
  elif msg[0] == "O": # 收到來自發(fā)送消息進(jìn)程發(fā)送到服務(wù)端的斷開請求
   # 進(jìn)程退出并打印提示
   sys.exit("login out successfully")

# 主程序
def main():
 # 創(chuàng)建tcp套接字
 s = socket()
 # 連接服務(wù)端
 s.connect(ADDR)
 # 創(chuàng)建多進(jìn)程,子進(jìn)程用于發(fā)送消息,父進(jìn)程用于接收消息
 pid = os.fork()
 if pid < 0:
  print("system error")
 # 子進(jìn)程
 elif pid == 0:
  send_msg(s)
 # 父進(jìn)程
 else:
  recv_msg(s)
if __name__ == '__main__':
 main()

總結(jié)

以上所述是小編給大家介紹的Python_模擬FTP文件服務(wù)器的操作方法,希望對大家有所幫助,也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python實(shí)現(xiàn)鼠標(biāo)自動在屏幕上隨機(jī)移動功能

    Python實(shí)現(xiàn)鼠標(biāo)自動在屏幕上隨機(jī)移動功能

    這篇文章主要介紹了Python實(shí)現(xiàn)鼠標(biāo)自動在屏幕上隨機(jī)移動功能,具有很好的參考價(jià)值,希望對大家有所幫助。還等什么?一起跟隨小編過來看看吧
    2020-03-03
  • Python安裝Talib庫的詳細(xì)圖文教程

    Python安裝Talib庫的詳細(xì)圖文教程

    talib庫的安裝之路坑特別多,這是最常見的,下面這篇文章主要給大家介紹了關(guān)于Python安裝Talib庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Pandas技巧分享之創(chuàng)建測試數(shù)據(jù)

    Pandas技巧分享之創(chuàng)建測試數(shù)據(jù)

    學(xué)習(xí)pandas的過程中,為了嘗試pandas提供的各類功能強(qiáng)大的函數(shù),常常需要花費(fèi)很多時(shí)間去創(chuàng)造測試數(shù)據(jù),本篇介紹了一些快速創(chuàng)建測試數(shù)據(jù)的方法,需要的可以參考一下
    2023-07-07
  • Python os.listdir與os.walk實(shí)現(xiàn)獲取路徑詳解

    Python os.listdir與os.walk實(shí)現(xiàn)獲取路徑詳解

    這篇文章主要介紹了Python使用os.listdir和os.walk獲取文件路徑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-10-10
  • python產(chǎn)生模擬數(shù)據(jù)faker庫的使用詳解

    python產(chǎn)生模擬數(shù)據(jù)faker庫的使用詳解

    這篇文章主要介紹了python產(chǎn)生模擬數(shù)據(jù)faker庫的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python打包為linux可執(zhí)行文件的詳細(xì)圖文教程

    python打包為linux可執(zhí)行文件的詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于python打包為linux可執(zhí)行文件的詳細(xì)圖文教程,本文介紹的方法可以輕松地將Python代碼變成獨(dú)立的可執(zhí)行文件,需要的朋友可以參考下
    2024-02-02
  • 使用Python實(shí)現(xiàn)正態(tài)分布、正態(tài)分布采樣

    使用Python實(shí)現(xiàn)正態(tài)分布、正態(tài)分布采樣

    今天小編就為大家分享一篇使用Python實(shí)現(xiàn)正態(tài)分布、正態(tài)分布采樣,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python sklearn庫實(shí)現(xiàn)PCA教程(以鳶尾花分類為例)

    Python sklearn庫實(shí)現(xiàn)PCA教程(以鳶尾花分類為例)

    今天小編就為大家分享一篇Python sklearn庫實(shí)現(xiàn)PCA教程(以鳶尾花分類為例),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python畫圖常見不同圖片格式保存方式

    python畫圖常見不同圖片格式保存方式

    這篇文章主要介紹了python畫圖常見不同圖片格式保存方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解Python中的自定義密碼驗(yàn)證

    詳解Python中的自定義密碼驗(yàn)證

    這篇文章主要為大家介紹了如何實(shí)現(xiàn)在Python中的自定義密碼驗(yàn)證,并對密碼驗(yàn)證功能進(jìn)行單元測試。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02

最新評論