- FTP背景介紹:
FTP(File Transfer Protocol)協議,顧名思義為文件傳輸協議。由已故的Jon Postel與Joyce Reynolds開發,並於1985年10月發布。其底層基於TCP/IP協議。FTP目前主要用於匿名下載公共文件,也可以在兩台跨系統的計算機之間傳輸文件。
為了實現FTP協議,很顯然需要同時構建FTP服務器與客戶端。而服務器與客戶端均通過兩個套接字(分別綁定在“命令端口”與“數據端口”)進行雙向通信。對於數據端口,從服務器的角度來看有兩種綁定模式,分別為“主動模式”與“被動模式”。主動模式下,服務器的數據端口主動連接客戶端的數據端口;被動模式下,服務器告知客戶端數據端口號,再由客戶端主動發起連接。
本篇內容將對FTP服務器與客戶端進行簡單的構建,僅供參考!注意,搭建服務器需要用到第三方庫pyftpdlib(沒有的話,則在終端輸入"pip install pyftpdlib"進行安裝),搭建客戶端需要用到標准庫ftplib。
- 搭建FTP服務器:
1 # 搭建FTP服務器 2 3 from pyftpdlib.authorizers import DummyAuthorizer 4 from pyftpdlib.handlers import FTPHandler 5 from pyftpdlib.servers import FTPServer 6 7 import socket # 主要用於獲取當前主機IP地址 8 9 # 1. 添加授權用戶 10 authorizer = DummyAuthorizer() 11 # 添加非匿名用戶, 各項分別代表: 用戶名, 密碼, 用戶根目錄, 用戶權限 12 authorizer.add_user('xxx', '12345', './', 'elradfmwM') 13 authorizer.add_user('yyy', '12345', '../', 'elradfmwM') 14 # 添加匿名用戶, 各項分別代表: 匿名用戶根目錄 15 authorizer.add_anonymous('./') 16 17 # 2. 更改FTP處理器的授權用戶屬性(歸屬於"類屬性") 18 handler = FTPHandler 19 handler.authorizer = authorizer 20 21 # 3. 通過主機名與端口號實例化FTP服務器, 並啟動 22 server = FTPServer((socket.gethostbyname(socket.gethostname()), 9999), handler) 23 server.serve_forever()
此時,最好記錄下主機的IP地址與端口號,方便后面搭建客戶端。
- 搭建FTP客戶端:
1 # 搭建FTP客戶端 2 3 from ftplib import FTP 4 5 import socket # 主要用於獲取當前主機IP地址 6 7 # 1. 實例化FTP對象, 並連接 8 ftp = FTP() 9 ftp.connect(socket.gethostbyname(socket.gethostname()), 9999) # 應該輸入服務器IP地址. 由於此處客戶端與服務器建立在同一台主機上, 因此采用socket方法替代 10 11 # 2. 登錄 12 ftp.login("xxx", "12345") 13 # 匿名登錄方法, 注意: 匿名用戶的權限較低 14 # ftp.login("anonymous") 15 16 # 3. 交互 17 # 查看當前工作目錄, 及指定目錄下的內容 18 # print(ftp.pwd(), ftp.dir('./')) 19 # 下載文件 20 ftp.retrbinary("RETR aaa.jpg", open("aaa.jpg", 'wb').write) 21 # 上傳文件 22 ftp.storbinary("STOR scheme.txt", open("scheme.txt", 'rb')) 23 24 # 4. 退出 25 ftp.quit()
也可以在瀏覽器地址欄輸入url來訪問服務器,如下:
ftp://ip:port/
其中,ip代表服務器IP地址,port為相應的端口號(如上面的9999)。 - 參考:
https://www.cnblogs.com/huangxm/p/6274645.html