FTP即文件傳輸協議;它基于客戶機-服務器模型體系結構,應用廣泛。它有兩個通道:一個命令通道和一個數據通道。命令通道用于控制通信,數據通道用于文件的實際傳輸。使用FTP可以做很多事情,比如移動、下載、復制文件等。
server端:centos 7 python-3.6.2
客戶端:Windows 7 python-3.6.2 pycharm-2018
程序目的:1、學習使用socketserver實現并發處理多個客戶端。
2、了解使用struct解決TCP粘包。
(本人菜鳥一枚,對于開發規范,接口設計完全不懂,完全是隨心所欲,自娛自樂。寫博客主要是記錄自己學習的點點滴滴,如有不足之處還請見諒。)
1.1 目錄結構如下:
1.2 目錄簡介:
FTP_SERVER:程序主目錄
app:程序主邏輯目錄,目錄下有四個模塊:
FTPserver.py:FTP Server端啟動入口。
login.py:認證注冊模塊,用于處理用戶注冊,登錄認證。
dataAnalysis.py:命令解析模塊,負責解析,執行客戶端命令。
FileOpertion.py:負責文件讀,寫。數據發送,數據接收。
db:存放user_pwd.db文件,用于存放用戶信息(用戶名,密碼,FTP目錄總空間,已使用空間等)
lib:存放公共數據。
1.3 模塊中類的繼承關系
1.4 執行流程
1.4.1 程序啟動文件FTPserver.py,程序啟動后進入監聽狀態。核心代碼如下:
class MyFtpServer(socketserver.BaseRequestHandler): def handle(self): # 重寫handle方法,處理socket請求 print(f"連接來自{self.client_address}的客戶端") commom_obj = Commom() data_analy = DataAnalysis() login_obj = Login() while 1: # 執行用戶選項:1、登陸系統 2、注冊賬號。并返回一個結果 status_id = login_obj.run_client_choice(self.request, commom_obj) if status_id == "01": # 登陸成功 if not self.run_ftp_server(data_analy,commom_obj): # 執行ftpserver主功能 break elif int(status_id) == -1: # client斷開連接了 break print(f"客戶端{self.client_address}斷開了連接") def run_ftp_server(self,data_analy,commom_obj): """" 登陸成功后,接收客戶端發來的命令,并進行處理 :param data_analy:負責解析,執行客戶端命令的對象 :param commom_obj:程序執行時所需的數據對象 :return 返回false代表客戶端斷開連接了 """ while True: try: cmd_len_pack = self.request.recv(4) cmd_len = struct.unpack('i',cmd_len_pack)[0] # 獲取命令長度,防止粘包 except Exception: break recv_data = self.request.recv(cmd_len).decode('utf-8') # 接收客戶端數據 if recv_data.upper() == "Q": # 客戶端提出斷開連接了 break # 解析,處理客戶端的命令 data_analy.syntax_analysis(recv_data, self.request, commom_obj) return Falseif __name__ == '__main__': print('運行FTP服務') ip_port = ('192.168.10.10',9000) # 創建并發服務端對象 server = socketserver.ThreadingTCPServer(ip_port, MyFtpServer) # 開啟服務 server.serve_forever()
新聞熱點
疑難解答