[Python]製作一個類似iperf的測速程式-使用Socket

延續上一篇的Client/Server架構,在Server不變的情況下,新增新功能。主要是一個想法,不確定網路上測試網速的寫法是不是這樣。我的想法很簡單:我從Server或是Client端,傳一個固定大小檔案到另一端,然後再去除以開始和結束的間隔時間,就是網速。Client->Server就是Upload,Server->Client就是Download。

網路上找到的測試網域之間的網速工具,有名氣的是iperf,分成Client和Server端,先開啟Server端準備好之後,Client端透過IP去連線,在console畫面底下輸入一些參數,接著就根據參數執行,畫面上就會帶出一些結果。而這樣的方法,蠻適合用python去快速實現的。

我就模擬一個簡單的測速腳本,再把現下網頁測試流行的上下行測試加進來,腳本過程中,會分別將上傳和下載的數據顯示出來。

「架構規劃與定義」

前半部和上一篇一樣,Server開啟準備好後,等待Client連線。接著Client就發送一些訊息,告訴Server開始測試,彼此是透過一些特定訊息來傳遞的。先執行download測試,再來執行upload測試。

延續上一篇架構,除了connect/disconnect之外,我還新增了一些訊息:
  • download:Client通知Server開始傳檔案了
  • download/start
  • send:傳送送完的時間差,分成Client和Server兩種
    • send/server:Server傳送測試檔案的時間差
    • send/server/test1/time
    • send/client:Client傳送測試檔案的時間差
    • send/client/test1/time
還需要一個產生檔案的程序。程序雖然很簡單,主要用「open(filename, "w")」就好,但是要快速和準確。原先用迴圈,產生random float,每生成一個數值添加到檔案中,就去判斷檔案大小,直到超過而停止。後來發現這樣光產生一個5MB檔案,得花上足足15秒。改進用random int,限制一位數(就等於1byte),不判斷大小,直接跑檔案長度迴圈。這個縮短很多時間,但還是感覺的出來。

最後我用index%10去當數值寫入,雖然不像亂數漂亮,但可以快速生成。

「實做部份」

Client/Server架構同上一篇就不再重複。我這邊偷懶方式寫。我看有人把Server download下來的檔案copy成自己所需,這樣upload時,Client不用重建一次。我是沒有這樣做,所以我腳本裡頭,Server也做一份,Client也做一份。理論上來說這些檔案應該當作暫存檔,傳完就丟棄的部份也沒做。另外我沒有參考文獻,不知道有規範的網路測速應該送哪些檔案大小,就用三個大小(1MB, 5MB, 10MB)當作demo了。

之後應該可以把一些參數當作引數,在執行時期就帶在後面,跟iperf會更像。

「結果呈現部份」

我Server還是保留畫面,沒有更動,後端新增處理程序,所以多了一些log呈現。而Client是新建立的,因為是效法iperf,所以用console畫面呈現。
「腳本下載」



0 意見:

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK