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

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

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

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

客戶端可以查看服務(wù)器文件庫中有什么文件。
客戶端可以從文件庫中下載文件到本地。
客戶端可以上傳一個本地文件到文件庫。
使用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基礎(chǔ)之注釋的用法

    Python基礎(chǔ)之注釋的用法

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python注釋的用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • urllib2自定義opener詳解

    urllib2自定義opener詳解

    這篇文章主要介紹了urllib2自定義opener詳解,需要的朋友可以參考下
    2014-02-02
  • Python實(shí)現(xiàn)簡單猜拳游戲

    Python實(shí)現(xiàn)簡單猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡單猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python中encode()方法的使用簡介

    Python中encode()方法的使用簡介

    這篇文章主要介紹了Python中encode()方法的使用簡介,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • Python對象的list如何快速按照屬性查找

    Python對象的list如何快速按照屬性查找

    這篇文章主要介紹了Python對象的list如何快速按照屬性查找問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Python字符串編碼轉(zhuǎn)換 encode()和decode()方法詳細(xì)說明

    Python字符串編碼轉(zhuǎn)換 encode()和decode()方法詳細(xì)說明

    這篇文章主要介紹了Python字符串編碼轉(zhuǎn)換 encode()和decode()方法詳細(xì)的說明,下面文章圍繞encode()和decode()方法的相相關(guān)資料展開內(nèi)容,具有一定的價(jià)值,需要的朋友卡通參考一下
    2021-12-12
  • python起點(diǎn)網(wǎng)月票榜字體反爬案例

    python起點(diǎn)網(wǎng)月票榜字體反爬案例

    大家好,本篇文章主要講的是python起點(diǎn)網(wǎng)月票榜字體反爬案例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • matplotlib.subplot()畫子圖并共享y坐標(biāo)軸的方法

    matplotlib.subplot()畫子圖并共享y坐標(biāo)軸的方法

    Matplotlib的可以把很多張圖畫到一個顯示界面,本文主要介紹matplotlib.subplot()畫子圖并共享y坐標(biāo)軸的方法,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python中的協(xié)程(Coroutine)操作模塊(greenlet、gevent)

    Python中的協(xié)程(Coroutine)操作模塊(greenlet、gevent)

    這篇文章介紹了Python中的協(xié)程(Coroutine)操作模塊(greenlet、gevent),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • win10下opencv-python特定版本手動安裝與pip自動安裝教程

    win10下opencv-python特定版本手動安裝與pip自動安裝教程

    這篇文章主要介紹了win10下opencv-python特定版本手動安裝與pip自動安裝教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評論

河北省| 米易县| 武威市| 石楼县| 洪湖市| 永康市| 金坛市| 平泉县| 苍梧县| 嵊泗县| 新丰县| 屯留县| 云霄县| 柞水县| 南昌县| 和田市| 庐江县| 墨竹工卡县| 屏东市| 卢氏县| 台中市| 霞浦县| 福贡县| 迁安市| 长治县| 景东| 项城市| 玉门市| 阜宁县| 无棣县| 华坪县| 博客| 乌兰浩特市| 曲阳县| 二连浩特市| 弥渡县| 皮山县| 宾川县| 双牌县| 宁津县| 桂平市|