[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畫面呈現。
「腳本下載」



20171006-鐘錶技術實務班結業了


一開始在勞動部動力發展組網站報名這堂課的時候,同事都在問是不是因為家裡關係,要去繼承家業等等之類的話。是說講這些還真的太早,況且現在工作收入還算是穩定,雖然今年中秋獎金全公司都居然只領10%,一整個慘。

而這堂課純粹就是興趣,從小看老爸修理精密的手錶,覺得是一個很酷的工作,只是台灣沒有鐘錶維修學科,唸的又是資訊,對這行業就越來越遠。直到曲仔上網看見這堂課。2個多月下來,老師帶我們拆了兩支經典的機械錶機芯,從發條盒,到最精細的擺輪都反覆的練習,拆裝,保養,最終這兩個機芯也是讓我們帶回去練習。政府負擔80%學費,真的是太划算了。

上面的照片是用放大鏡套在手機鏡頭上拍的。然後來個全班大合照!


20170923-麗寶樂園家庭日

六師兄公司上個月底在麗寶樂園舉辦家庭日,按照往常,我們也一起串門子。由於這次多了長輩,和妹妹三寶的出生,大車也塞滿了。我和曲仔就報名從板橋車站出發的接駁車。早上八點出發,塞個車到麗寶已經11點多了,我就先去報到,等他們一家大大小小。

因為那天風和日麗,真是熱得沒辦法像年輕人一樣玩耍,結果我跟曲仔就真的一直在逛Outlet,吹吹冷氣。悠閒吃了中餐,買了超划算的雙人牌。


再來等到老媽來了,妹妹生病不舒服,先回飯店休息,所以我們和老媽就帶著妹妹的大寶和二寶吃飯,逛街。妞長大越來越可愛啊!!
老媽辛苦了,在家裡和外頭都一樣,負責輪流照顧三寶,正餐也只能快速的吃完,希望這次難得的出遊,有讓老媽稍微放鬆了心情。
然後,就到了晚上重頭戲,晚會和摸彩。聽著旺福的搞笑,魏如萱和戴佩妮美妙的歌聲,一整個歡樂氣氛,好像暑意都全消了。最後,我們還是沒有去玩到麗寶設施,還好六師兄有帶他大寶去玩雲霄飛車。


[Python]用UI展示一個簡單的即時通系統 - 使用Socket

我們那個很有想法的老闆,最近又想了一個新點子,希望我們的設備,可以讓遠端的2台裝置,互相溝通。一開始我想法是,有困難。以我們現有的設備都是走單機版,且利用網路2層結構來說,是很難的。首先我就不知道遠端那個設備在哪裡,IP,Gateway怎給我,等等。

但是後來我想想,站在軟體角度,如果像是teamviewer那種架構,或是類似line聊天軟體,根本不需要知道對方的IP/Gateway,一樣可以連線溝通啊。而且我們設備上層還是軟體架構,如果用軟體架構實現,再去透過抓包解析後設定到硬體,這樣路就通了。所以想說利用Python來快速實做一下聊天軟體,OK的話再回去C++/C# AP那邊添加功能。

簡單來說,就是有一個中央負責處理轉發的Server,以及連線到Server的許多的Client。Client之間,只需要利用ID來識別,就可以傳送資料。就像是聊天軟體一樣簡單達到需求。

「架構規劃與定義」

流程大概就是幾個client端連線之後,可以看到彼此,進而傳遞訊息,因此我畫出底下的圖代表。Server由上而下有時間的順序。
根據上面的圖,可以看出主要溝通訊息可以分成四類:connect(紅),friends(藍),message(綠),disconnect(黃)。原先想用類似C++ structure方式組包來送訊息,但因為這單純聊天比較簡單,只有幾種型態,我就以純文字方式定義就好。訊息中夾帶多組參數,會以"/"隔開。不用反斜線,因為會有跳脫字元問題。
  • 。connect:Client發連線訊息給Server,夾帶name訊息。Server會建立新連線。
  • connect/name:Client1
  • 。friends:Server接收到connect/disconnect訊息時,會整理朋友列表清單,傳送給所有Client。
  • friends/client1/client2
  • 。message:Client1傳送聊天訊息給Server,Server根據來源目的,轉發給Client2。
  • message/to:Client2/from:Client1/hello
  • 。disconnect:Client發斷線訊息給Server,夾帶name訊息。Server會斷開Client連線。
  • disconnect/name:Client1

「實做部分」

要做到這樣效果,是利用Socket。Python在使用socket上是非常非常方便的。Socket Server/Client的寫法網路上已經一堆了,如何連線,傳送接受,斷線就不用敘述了,底下就說明幾個方向。

Server部分:

      Server需要接收很多連線,故我寫一個簡單class去記錄每一個connection的handle, portnum, 以及名稱,然後把每個connection class去append到一個connection list中,形成一個client列表。我定義Server是被動部分,有連線或是命令進來才有相對應反應,本身不會自己主動發什麼訊息的。因此接收部分,共會接收到三種命令:
    
    
  1. 連線命令:
    • 格式
    • connect/name:client1
    • 處理:分析出client名稱之後,保存至connection list
    • 反應
      1. Server對此client回傳message訊息當做回應,內容為"Hello clientname"
      2. Server根據connection list清單建立friends訊息,回傳給所有connection
  2. 斷線命令:
    • 格式
    • disconnect/name:client1
    • 處理:分析出client名稱之後,從connection list中移除,並關閉連線
    • 反應:Server根據重整後的connection list清單,建立friends訊息,回傳給所有connection
  3. 訊息命令:
    • 格式
    • message/to:client2/from:client1/hello
    • 處理:分析出給那個client名稱,並在connection list清單找到目的client
    • 反應
      1. Server將message訊息轉發給目的client
      2. Server將message訊息轉發給來源client
    
    

Client部分:

    Client部分除了主動向Server傳送訊息之外,還會接收來自於Server的回應。傳送部分有三個命令:
    
    
  1. 連線命令:
    • 格式
    • connect/name:client1
    • 處理:將自己的名稱(ID),組成命令之後,發送至Server
  2. 斷線命令:
    • 格式
    • disconnect/name:client1
    • 處理:用戶按下close之後,將自己的名稱(ID),組成命令之後,發送至Server
  3. 訊息命令:
    • 格式
    • message/to:client2/from:client1/hello
    • 處理:根據用戶選擇的目的client,自己的ID以及要傳送的訊息,組成命令之後,發送至Server
而接收部分也有三個命令:
    
    
  1. 朋友清單命令:
    • 格式
    • friends/client1/client2/......
    • 處理:分析出每個client名稱
    • 反應:添加至朋友清單
  2. 斷線確認命令:
    • 格式
    • disconnect/name:client1
    • 處理:確保Server回應這個client斷線,表示Server已經把client從清單中移除並斷線
    • 反應:關閉視窗
  3. 訊息命令:
    • 格式
    • message/to:client2/from:client1/hello
    • 處理:分析出給來自那個client名稱,以及訊息內容。
    • 反應:顯示在螢幕上

「結果呈現部分」

根據上面定義,實做出畫面。然後覺得server如果是command也太單調,所以也弄了一個界面,就大概長下圖這樣。用界面呈現是因為command視窗不好表現thread,因為畫面被等待輸入lock,但背後有命令進來,輸入畫面會跑掉不好看。

一個Server,以及可以支援多個Client。有多個連線之後,Client可以跟線上其他Client丟訊息,被丟訊息的Client也會看到是誰來的。編碼用utf-8,就可以支援中文:
當我將其中一個連線關閉時,另一個client端也會同步更新清單,可以看見斷線的client被移除了。

「腳本下載」

Server
Client

「後記」

。Server沒有考量到複雜度,所以當client需求多的時候,效率應該會很差。以展示來說應該夠了。
。Server沒有太多功能,重新連線,踢掉Client等功能沒做。界面上只有記錄而已,有單調
。Client因為簡單展示,沒使用帳號密碼登入。
。結構可以再定義更多,比方說分組。
。雖然腳本開始有判斷Python2/3,但實際上只在Python 2.7跑過,版本3應該會有問題
。還很多沒考量的......





20170506-草嶺走去宜蘭

從福隆下車,順著往草嶺古道的指標,走個1個多小時就可以看到入口。從貢寮過去好像比較快一點。不過從福隆過去,沿途會經過一戶人家,有好幾十隻的貓,貓咪狀況都不錯,有些很親人。
草嶺古道開始比較多樹林遮陰,後面幾乎都是開闊的草原,如果夏天來會很熱,春秋是個很好的季節。
我們走得那天,因為山下飄著小雨,草嶺山頂,瞬息間就起大霧,甚至還有大到能見度不到5公尺的。起霧的時候,走古道得特別小心,旁邊可是沒有欄杆的。
走了將3個多小時,到古道盡頭,是大里天公廟。我們晚上是住礁溪,走到大馬路,繼續就往前走,就可以到大里火車站。
第二天我們的目標是林美石盤古道。古道口有一攤水果攤,小草兒因為來了很多次,和老闆很熟,可以話家常。這邊買些水果,剛好走古道時可以邊走邊吃。阿不過記得垃圾不落地,古道入口處就有洗手間和垃圾捅了。
古道最陡的一段就是這個樓梯而已,而且還分成好幾段,還是很容易的。

最後補上在宜蘭吃的東西,因為要走草嶺,所以身上都自備了一些糧食,到宜蘭吃店面的只有早餐和晚餐。都好好吃啊!



20170429-桃園農場烤肉

前一陣子風行一波控窯,烤肉風,假日時常就會約烤肉。桃園的活力健康農場離台北很近,大家交通也方便,而且場地又很大,適合很多家庭來當作聚會。因為食物多,所以園區裡頭有大約三隻(只看到三隻)野貓。都很怕人,慢慢培養感情之後才願意亮相。除了野貓,園區還有養許多小動物,兔子應該算是明星動物。
園區內有許多小水池,可以釣一些美國螯蝦,美國螯蝦是強勢物種,繁衍又很快,租釣竿可以讓你玩好幾個小時,順便幫農家控制數量,還真是會想。
這次買套裝行程,包含控窯,所以除了烤肉東西之外,還有烤地瓜。個人覺得烤肉普通,畢竟自己帶食材得收清潔費用,將就點。烤地瓜就很好玩,農家教你自己挖土,埋地瓜和蛋,稍微講究擺法。最後完成後得自行拿鍬子去挖開,洗掉包裹蛋的土。
最後還有自助擂茶和包雞,這農場還真的算是行程很豐富。門票最後還可以抵掉園區內消費,感覺是很超值的農場。


20170403-只去溪頭沒去妖怪村

妹子有天想去散心,看到網路上有團購住宿券,很便宜,還含課程和吃的,失心瘋就買了,順便問我們要不要去。這家飯店位於去溪頭的路上的必經之路,很好識別,離溪頭也算近。含下午茶,早餐餐點,螢火蟲導覽以及彩繪課程,個人覺得划算。
午餐地點我們找了看地圖很近的竹亭咖啡,交通卻是鮮少人走的蜿蜒小路,有種世外桃源的感覺,人煙稀少,環境很好,很適合露營。為了帶走竹餐具,還加點了甜點。
咖啡店地形關係,很多平台可以當作露營場地,地勢緩坡。帶小朋友過來跑也不錯。
溪頭踏青,有很多方式,依據個人體力。中途真走不下去,還可以攔接駁車(收費)。說沒有去妖怪村,其實還是有,畢竟溪頭出口出來一定會經過,也買了好吃的限定時間限量出爐的麵包,不過人多了,擁擠了,就跟悠閒扯不上關係了。


搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK