linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
這段時間在學習python,接觸到了網絡編程中的socket這塊,加上自己在用的Linux服務器都是原生支持python的,于是乎有了個做文件傳輸功能程序的想法。
畢竟python語言中,有下載功能的框架一抓一大把,但是主機與主機間快速搭建文件(夾)傳輸通道的程序似乎不常見,因為我剛接觸python不久,但是我不知道也不奇怪,總得來說,自己做一個練手,成就感滿滿。
項目地址
https://github.com/Ccapton/python-stuff/tree/master/filetransporter
實操預覽
本地主機發送文件到遠端服務器主機。
思維導圖
文件傳輸系統以上思維導圖僅供參考,畢竟表達能力有限,具體功能要追究到代碼處才能分析其原理。
原理
基于socket的通信,相信會編程的朋友都不陌生,而通過socket來傳輸文件也是很常見的,但是這僅僅是對于單個文件來說很容易實現。
如果是多文件呢?
我在實現本系統之前嘗試了幾次,用單一socket通道來傳輸多文件不切實際,因為調用socket.recv()方法的時候,返回的數據格式是原始數據str類型,要分割不同文件的數據有很大難度。
因為涉及到接收、發送方兩端文件數據接收和發送進度的統一性,就要用另外的指令來控制傳輸工作不亂套,于是我想到多開一個socket作為傳輸指令的通道,這樣指令和數據就分離了,也就容易控制傳輸工作了!所以有了指令線程和數據線程之分。
要實現傳輸整個文件夾,首先要遍歷這個文件夾,把在其內的所有文件結構準確無誤的還原出來;因為是通過一個socket通過傳輸數據,所以傳輸文件只能一個接一個來,這樣,文件的遍歷工作只能等前一個文件傳輸完畢后才能繼續進行,于是又要對遍歷工作設計一番。
經過改造,我在文件查找(遍歷)器內加入了while循環體和供外界繼承的回調類,這樣就能達到我想要的文件通過socket按順序傳輸的效果了。
文件查找器FileFinder(阻塞型)源碼:
import os,time# 文件、文件夾尋找類 (阻塞型)# 阻塞的設計:為了等待調用者的耗時操作【否則很快就完成了文件的遍歷任務,調用者達不到順序操作文件(夾)的意圖】class FileFinder: def __init__(self,finderCallback): self.finderCallback = finderCallback # 文件(夾)路徑下所有文件的總大小 self.sum_size = 0 # 調用者控制的參數,若為False,則遍歷工作繼續進行,若為True,則阻塞任務,等待調用者完成它的其他耗時操作后在考慮是否改變此值 self.recycle = True # 調用者控制的參數,若為False,則正常工作,若為True,則當recycle為False時遍歷工作不阻塞快速完成,recycle為True時遍歷工作阻塞 self.off = False # 文件(夾)找到時的回調類 class FinderCallback: # 找到文件夾 def onFindDir(self,dir_path): pass # 找到文件 def onFindFile(self,file_path,size): pass # 預留的刷新函數 def onRefresh(self): pass # 查找文件(夾)方法 def list_flie(self,root_dir): if os.path.isfile(root_dir): while self.recycle: time.sleep(0.05) if self.finderCallback: self.finderCallback.onFindFile(root_dir,os.path.getsize(root_dir)) self.finderCallback.onRefresh() if not self.off: self.recycle = True else: dirlist = os.listdir(root_dir) # 列出文件夾下所有的目錄與文件 for dir in dirlist: path = os.path.join(root_dir, dir) if os.path.isfile(path): while self.recycle: time.sleep(0.05) if self.finderCallback: self.finderCallback.onFindFile(path,os.path.getsize(path)) self.finderCallback.onRefresh() if not self.off: self.recycle = True else: while self.recycle: time.sleep(0.05) if self.finderCallback: self.finderCallback.onFindDir(path) self.finderCallback.onRefresh() if not self.off: self.recycle = True # 遞歸調用(當遍歷到文件夾時,繼續遍歷,直到當前文件夾下沒有文件夾為止) self.list_flie(path)通過繼承FileFinder的回調類FinderCallback,重寫其 onFindDir(self,dir_path) 和onFindFile(self,file_path,size)方法,在這兩個方法里面發送相關指令到接收端。但最難的就是兩端的指令線程內的socket指令信息的處理,這需要深入代碼去具體研究,本人能力有限,也就不細說了。需要研究一番的朋友,請移步該項目地址 https://github.com/Ccapton/python-stuff/tree/master/filetransporter注意
運行接收端程序,需要一個能訪問的地址,也即是說最好是局域網內進行文件傳輸工作,因為局域網本地ip都是可以直接訪問的,若是在公共網絡傳輸文件,必須知道接收方主機的公網ip和內網ip。例如我現在用到接收方主機是騰訊云的主機,內網ip是10.135.xxx.xxx,公網ip是111.120.xxx.xxx。該主機內,運行接收(服務)端程序python3 ftserver.py -i 10.135.xxx.xxx -d /home/ubuntu/downloads而在你的主機運行發送(客戶)端程序發送文件夾bilibilipython3 ftclient.py -i 111.120.xxx.xxx -f /Users/capton/desktop/bilibili因為騰訊云、阿里云等國內虛擬主機供應商是采用NAT地址轉換對云主機進行地址分配的,所以按照我上面的步驟來運行兩端程序才能連通。- END -
原文鏈接:
https://www.jianshu.com/p/07ff2a7d22f4文源網絡,僅供學習之用,如有侵權,聯系刪除。
往期精彩◆ ?50款開源工具你都用過嗎?
◆ ?python+C、C++混合編程的應用
◆ ?python網絡爬蟲的基本原理詳解
總結
以上是生活随笔為你收集整理的linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零下73℃!俄罗斯西伯利亚破北半球历史最
- 下一篇: 就在今天:《英雄联盟》LPL 2023