python初學——網絡編程之FTP服務器支持多併發版本

對MYFTP項目進行升級。擴展支持多用戶併發訪問與線程池。MYFTP項目請見python初學——網絡編程之FTP服務器python

擴展需求

1.在以前開發的FTP基礎上,開發支持多併發的功能
2.不能使用SocketServer模塊,必須本身實現多線程
3.必須用到隊列Queue模塊,實現線程池
4.容許配置最大併發數,好比容許只有10個併發用戶linux

需求模型

用例名

MYFTPgit

場景

  • when:任意時間
  • where:任何地點
  • who:FTP用戶

用例描述

  • ftp使用用戶名密碼登陸。密碼須要加密認證、容許支持多用戶登陸。
  • 每一個用戶有本身的家目錄,全部的訪問必須限制在用戶的家目錄。但在家目錄中建立的目錄能夠進行目錄切換。
  • 用戶的目錄有磁盤配額。不容許超過磁盤配額。
  • 用戶能夠查看當前目錄下的文件列表。
  • 用戶能夠上傳和下載文件,而且保證文件的一致性。
  • 文件的傳輸過程當中顯示精度條。
  • 支持斷點續傳。
  • 支持多用戶併發訪問
  • 支持線程池

用戶價值

實現一套本身的FTP服務端與客戶端。github

約束

線程池使用Queue模塊實現數據庫

建模設計

UML圖

順序圖

  1. 登陸順序圖
    圖片描述

程序講解

程序主體

請從github下載後使用
MYFTP
README編程

目錄結構

在原來的lib目錄中增長一個mythread.py的文件。該文件是一個使用Queue模塊編寫的線程池類。json

+---bin                     # 執行程序目錄
|       create_user.py      # 建立用戶程序
|       myftpc.py           # ftp_server啓動程序
|       myftps.py           # ftp_client啓動程序
|       __init__.py
|
+---conf
|   |   settings.py         # 配置文件
|   |   __init__.py
|   |
|   \---__pycache__
|
+---core
|   |   logger.py           # 日誌生成文件
|   |   main.py             # 主程序文件
|   |   __init__.py 
|   |
|   \---__pycache__
|
+---db                      # 數據庫目錄
|   \---accounts            # 帳號表目錄
|---id_user_rs.json         # 帳號ID與用戶名對應關係
+---file_upload             # ftp文件服務器目錄
+---lib                     # 類文件
|   |   account.py          # 帳號類
|   |   db.py               # 數據庫類
|   |   myftp_client.py     # ftp客戶端類
|   |   myftp_server.py     # ftp服務端類
|   |   mythread.py         # 線程池類(新增長內容)
|   |   process.py          # 進度條展現類(暫時未使用)
|   |   __init__.py
|   |
|   \---__pycache__
\---log
        __init__.py

mythread.py文件介紹

mythread使用隊列簡單實現了一個線程池的功能。
實現的方式比較簡單,就是經過在隊列中存放maxsize的線程對象。當客戶端鏈接服務端後時從隊列中拿取一個線程對象,建立本身的任務。執行完任務後再往隊列中添加一個新的線程對象。segmentfault

# -*-coding: utf-8 -*-
# Auther: Henry Yuan
import threading
import time
import queue

class MyThread():
    """
        自定義的線程類,使用queue支持簡單的線程池
    """
    def __init__(self,maxsize):
        """

        :param maxsize:  隊列的數量
        """
        self.maxsize=maxsize
        self.q=queue.Queue(maxsize)  # 初始化一個隊列對象
        # 在隊列中先存放maxsize個隊列對象。這一步就作到了線程池的做用。
        for i in range(maxsize):
            self.q.put(threading.Thread)  # 在隊列中先存放線程對象

    def get_thread(self):
        """  從隊列中拿取線程對象

        :return:
        """
        return self.q.get()

    def put_thread(self):
        """  往隊列中存放線程對象

        :return:
        """
        self.q.put(threading.Thread)

環境

本系統基於python 3.6版本開發。可運行在安裝了python 3.6版本的linux或windows系統中。windows

用法

建立FTP用戶

進入bin目錄:服務器

> cd bin

執行create_user.py:

> python ./create_user.py
Account:test2       # 用戶名
Password:test2      # 密碼
Home directory(test2):    # 帳號的根目錄。默認爲帳號名稱
Quota(bytes):10           # 帳號的quota。默認爲1G

===================ACCOUNT INFO===================
             Account:      test2
             Home Dir:     test2
             Quota:        10
==================================================

啓動ftp服務端

進入bin目錄:

> cd bin

執行create_user.py:

> python ./myftps.py

啓動ftp客戶端

進入bin目錄:

> cd bin

執行create_user.py:

> python ./myftpc.py

FTP用於登陸:

Name:test2
Password:test2
Account [test2] login successful
ftp>:

客戶端命令

  1. ls: 查看用戶當前目錄的文件和目錄列表

    ftp>: ls
      驅動器 D 中的卷是 新加捲
      卷的序列號是 020D-6062
     
      D:\deployment\MYFTP\file_upload\test2 的目錄
     
     2018/04/16  12:17    <DIR>          .
     2018/04/16  12:17    <DIR>          ..
                    0 個文件              0 字節
                    2 個目錄 45,605,543,936 可用字節
     Directory [test2] list successful.
     ftp>:
  2. pwd: 查看當前所在目錄

    ftp>: pwd
    Directory [\] show successful.
  3. mdir: 建立目錄

    ftp>: mdir temp_dir
     Directory [temp_dir] create successful.
  4. cd:切換目錄

    ftp>: cd temp_dir
    Directory [temp_dir] change successful.
  5. put: 上傳文件-支持斷點續傳

    ftp>: get temp_file.md
    Start download -----> temp_file.md
    trandata: %s b'test123'
    [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100% recvsize:7, filesize:7
    File [temp_file.md] download successful.
  6. get: 下載文件-支持斷點續傳

    ftp>: put temp_file.md
    [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100%
    File [temp_file.md] upload successful.
相關文章
相關標籤/搜索