113.10.02-測試完整版的程式說明產生
使用繁體中文,根據圖片,及以下說明,建立實際可以執行的完整範例程式,程式需分成伺服端及clinet端兩支程式,謝謝
使用繁體中文,在winn1環境下,用python語言實作及UI界面,伺服端電腦有權限可以控制client端電腦,區域網路中,新增傳輸與接收檔案功能,呼叫外部upd-sender.exe及upd-receriver.exe的程式來進行傳輸,這upd-sender.exe及upd-receriver.exe程式的位置的呼叫可以是在"C:\Windows\System32\udp-receiver.exe"、"C:\Windows\System32\udp-sender.exe",或是跟著程式啟動的資料夾中,兩種都可以使用,clinet端電腦,收到伺服端電腦的廣播後,跟伺服端電腦進行報到
程式建構,說明如下:
所有的程式都有要註解說明,好以後維護
區域網路中的client端電腦要先跟伺服端電腦報到,伺服端電腦要在程式啟動時用現在的使用的IP,先進行區網的廣播,持續時間30秒,並要有手動廣播的按鈕可以再次廣播伺服端電腦的ip位置,等client端電腦報到後呈現在ui畫面上,需要呈現有client端電腦的ip位置、MAC位置、電腦名稱、狀態(online或offline),此列表中,如果使用者手動按下重新廣播按鈕後,在UI界面上,clinet端資料進行重整,client電腦離線就顯示offline,如果還連線就顯示online,讓clinet端可以知道伺服端在那而進行報到,使用upd協定,port號8500,如果被佔用就改用8501;伺服端使用者程式界面預設800*600,最上面寫標題"UDP-檔案派送",標題背景是藍色,標題是白色字,大小用18;
中間呈現是clinet端電腦報到的狀況,接收clinet端電腦的Ip位置、Mac位置、電腦名稱等三種,使用格子狀分開成:ip位置、Mac位置、電腦名稱、狀態(cliet端電腦有報到就顯示oneline、離線就顯示offline),區網中會有多台clinet端電腦上來報到,報到後,將就名稱暫存在UI畫面中顯示,如果還有新的client端電腦上來報到,就自動整理名單,間隔5秒確認,如果沒有新clinet電腦上來報到,就不進行clinet端電腦列表的重整,每一列代表的是一台clinet端電腦的資料,因此要讓伺服端使用者可以同時選擇多列的clinet端電腦進行檔案派送;
在UI界面中,clinet端電腦列表的下方,要有三個功能的按鈕在同一列呈現,分別是傳送單一檔案、傳送多個檔案、傳送資料夾,分別對應三個不同的功能傳送方式,按鈕字體大小為16,按鈕背景為"royalblue"色,文字為"orange"色,client端電腦列表呈現接在網格下方呈現,一開始先預設15列,可以動態增加;要讓表格內的資料置中呈現,可以利用 Treeview 的 column 和 heading 方法來設定每一個欄位的 anchor 屬性為 CENTER。這樣可以讓表格中的資料以及欄位標題置中對齊。
傳送單一檔案說明:
功能:一次只能選擇一個檔案
行為:伺服端使用者要先選定UI列表中已報到的clinet端電腦,最少是一列,最多是全選,選後要呈現被選定的狀態呈現,伺服端電腦使用者才能接著選定好一個想要傳輸派送的檔案,接著將檔案名稱轉成檔案傳輸清單,並先計算出要傳送的"檔案"的校驗碼,根據伺服端電腦使用者在選定列表中的clinet電腦,把檔案傳輸清單在背景執行,先傳送給選定的各client端電腦,等待2秒讓區網的clinet端電腦有時間可以接收檔案傳輸清單,當client端電腦接收到伺服端先傳來的檔案傳輸清單後,根據檔案傳輸清單,在client端程式啟動的位置要建立一個資料夾來準備接收檔案,然後clinet端電腦依照檔案傳輸清單啟動udp-receriver.exe接收檔案,在client端電腦使用 subprocess.Popen 捕獲 udp-receiver.exe 的標準輸出,此標準輸出在背景執行不要出現終端機的畫面,並解析進度資訊後回報給伺服端電腦程式,伺服端電腦程式接收clinet端傳來的標準輸出,要在UI界面最底的上方的欄位,"標準輸出"欄位,呈現伺服端電腦程式接收clinet端傳來的標準輸出,如沒有資料傳出,顯示"準備中",再等2秒後,伺服端電腦程式根據檔案傳輸清單接著等3秒讓clinet端電腦有時間完成接收檔案傳輸清單後,在背景呼叫udp-sender.exe檔用指令的方式執行,需加上依照伺服端選定的clinet電腦數量,在 send_file_list 函數中,我們根據選取的客戶端數量計算 min-receivers,即接收端的最小數量。使用 --min-receivers 設定最小接收端數量為 client_count(根據選定的客戶端數量動態設定)。加入 --autostart 參數,並設定為 3 秒,代表當有指定數量的接收端準備好後,自動啟動檔案傳輸開始傳輸,而後當client端電腦完成接收後,先計算接收到的檔案的校驗碼,並將結果在背景執行,回報給伺服端電腦,伺端端電腦接收後,比對校驗碼,確認檔案傳輸是否成功,如果成功,就alert一個"檔案已完成傳輸",完成單一檔案派送
傳送多個檔案說明:
功能:一次可以選擇多個檔案,
行為:伺服端使用者要先選定UI列表中已報到的clinet端電腦,最少是一列,最多是全選,選後要呈現被選定的狀態呈現,伺服端電腦使用者才能接著選定好想一個以上要傳輸派送的檔案,傳送檔案的方式如同傳送單一檔案,只是要依據伺服端使用者選定的檔案數量,拆成多次的的傳送,要等前一次檔案傳送完成後,才能進行下一個被選定的檔案,當多個被選定的檔案全部都完成傳輸後,才會alert一個"檔案已完成傳輸",完成單多檔案派送
傳送資料夾:
功能:選定資料夾,包含資料夾內的檔案,
行為:伺服端使用者要先選定UI列表中已報到的clinet端電腦,最少是一列,最多是全選,選後要呈現被選定的狀態呈現,伺服端電腦使用者才能接著選定好想一個要傳輸派送資料及內部的檔案,選定的資料夾名稱,要將資料夾名稱先轉成建立資料夾名單,把資料夾名單傳輸先在背景執行,傳送給選定的各client端電腦,等接收資料夾名稱後各client端電腦,要先建立傳來的資料夾,指定為接收的資料夾,其餘,傳送檔案的方式如同傳送單一檔案,只是要依據伺服端使用者選定的檔案數量,拆成多次的的傳送,要等前一次檔案傳送完成後,才能進行下一個被選定的檔案,當多個被選定的檔案全部都完成傳輸後,才會alert一個"檔案已完成傳輸",完成單多檔案派送
要讓表格內的資料置中呈現,可以利用 Treeview 的 column 和 heading 方法來設定每一個欄位的 anchor 屬性為 CENTER。這樣可以讓表格中的資料以及欄位標題置中對齊。
# 建立表格 self.tree = ttk.Treeview(root, columns=("IP", "MAC", "Name", "Status"), show='headings') # 設定表格標題與資料置中 self.tree.heading("IP", text="IP 位置", anchor="center") self.tree.heading("MAC", text="MAC 位置", anchor="center") self.tree.heading("Name", text="電腦名稱", anchor="center") self.tree.heading("Status", text="狀態", anchor="center")
def select_client_and_file(self):
selected_items = self.tree.selection() # 可以選取多個客戶端
選取多個客戶端:self.tree.selection() 現在可以選取多個客戶端,每個選取的客戶端會存儲在 client_ips 列表中。
傳送檔案到多個客戶端:在選取檔案後,程式會對每個選取的客戶端進行傳輸。每個客戶端 IP 都會分別執行 prepare_file_transfer_list 和 send_file_list
在UI界面中,三個檔案派送功能按鈕的欄位下方,增加一欄為傳輸狀況:分成→等待中、傳輸中、傳輸完成,字體大小為16,文字為"goldnrod"色;
在UI界面中,增加一欄在傳輸狀況下方,呈現"狀態"說明:被選定要傳送的"檔案的名稱"、"檔案大小"、"檔案校檢碼",檔案資料來源:為使用者用按選選定的檔案或是資料夾,
在UI界面最底的上方,增加一欄,標準輸出:顯示的資料是傳輸檔案過程中"伺服端電腦程式接收clinet端傳來的標準輸出",如果沒有傳輸檔案,就顯示"準備中,
在UI界面最底部獨立一欄,增加一格備註欄分成左右兩格,左格寫"感謝ChatGPT 感謝UDPcast",並用跑碼燈方式,從右向左移動;右格寫:製作者:WCS 日期:2024.10.01,字體大小為12,左右格的背景色均為"turquoise",文字均為"darkorange"色,
當檔案傳輸完成後,在UI界面上alert一個"檔案傳輸已完成",提醒使用者,在檔案進行傳輸的過程式,使用者不能再點選三個檔案派送功能按鈕,如果點選,alert一個"檔案傳輸中"提醒使用者,並且不能打中或中斷現在的檔案傳輸程序
在UI界面中,新增一欄,新增"廣播伺服器"按鈕,可以手動廣播伺服器30秒,讓之後還沒報到的clinet電腦可以收到廣播後,到伺服端電腦報到
在UI界面中,要有一個文字文方框,接收來自client端執行udp-receiver.exe時的標準輸出
各程序的執行,要免運互相干擾而造成UI畫面無法呈現的狀況,可以的話用多線程處理
client端電腦,啟動程式後就在背景執行,使用upd協定,接收網路上伺服端電腦電腦的廣播後進行報到,port號8500,如果被佔用就改用8501,就向伺服端電腦報到,要提供伺服端的資料為:clienrt端電腦的ip位置、MAC位置、電腦名稱等,然後在背景執行,等待伺服端電腦的訊號,當收到伺服端傳來的檔案清單,再開始呼叫udp-receiver.exe進行檔案接收工作
行為:啟動後在背景執行,回傳clienrt端電腦的ip位置、MAC位置、電腦名稱後,等待,配合伺服端電腦進行接收檔案的工作,當收到伺服端傳來的檔案清單後啟動udp-receiver.exe程式被呼叫執行時,要在背景執行,不要出現終端機的畫面讓clinet端電腦使用者打斷檔案傳輸的工作,
接收單一檔案說明:
功能:一次只能選擇一個檔案
行為:當client端電腦接收到伺服端先傳來的檔案傳輸清單後,根據檔案傳輸清單,在client端程式啟動的位置要建立一個資料夾來準備接收檔案,然後clinet端電腦依照檔案傳輸清單啟動udp-receriver.exe接收檔案,在client端電腦使用 subprocess.Popen 捕獲 udp-receiver.exe 的標準輸出,此標準輸出在背景執行不要出現終端機的畫面,並解析進度資訊後回報給伺服端電腦程式,伺服端電腦程式接收clinet端傳來的標準輸出,而後當client端電腦完成接收後,先計算接收到的檔案的校驗碼,並將結果在背景執行,回報給伺服端電腦
接收多個檔案說明:
功能:一次可以接收多個檔案,
行為:client端電腦會分多次接收到伺服端先傳來的檔案傳輸清單,依據伺服端使用者選定的檔案數量,拆成多次的的接收,要等前一次檔案完成接後,才能進行下一個被選定的檔案,其餘的方式如同"接收單一檔案"的方式,只是一次只接收一個檔案,數量的多少,依伺服端傳送的次數而定
接收資料夾:
功能:接收伺服端傳來的資料夾名單並建立資料夾,用來接收伺服端電腦傳來的資料夾內的檔案,
行為:等伺服端電腦使用者,傳來的資料夾名稱,後client端電腦,依照伺服端傳的資料夾名稱,要先建立傳來的資料夾,指定為接收的資料夾,其餘,接收檔案的方式如同"接收多個檔案"檔案
根據以上說明,建立實際可以執行的完整範例程式,謝謝
在w11環境下,"使用 udp-sender.exe 傳送檔案"程式,能依據選定的clinet端數量,使用--min-receivers 2(數量依據使用者選定的client端數量) --autostart autostart,的方式來修正程式
使用者在伺服端電腦,分成點選資料夾、一個檔案、多個大檔案三種按鈕功能可以選用,就能自動傳輸檔案到client端執行接收程式的電腦,
,在伺端端使用者UI界面下,UI界面要呈現client端電腦的ip位置、MAC位置、電腦名稱、狀態(online或offline)→區網中的client端電腦要先跟伺服端電腦報到,伺服端電腦要在程式啟動時用現在的使用的IP,先進行區網的廣播,持續時間30秒,並要有手動廣播的按鈕可以再次廣播伺服端電腦的ip位置,等client端電腦報到後呈現在ui畫面上,需要呈現有client端電腦的ip位置、MAC位置、電腦名稱、狀態(online或offline),此列表中,如果使用者手動按下重新廣播按鈕後,在UI界面上,將收集的clinet端資料進行重整,client電腦離線就顯示offline,如果連線就顯示online;此client端電腦列表資料,當伺服端使用選擇client端電腦時可以分選點選呈現的資料
如果有clinet的電腦報到後,在伺服端電腦,使用者要先選定UI列表中已報到的clinet端電腦後並呈現被選狀態,伺服端電腦使用者才能接著選定好想要傳輸派送的檔案(可以是多個)或是資料夾,需要有按鈕分成點選資料夾、一個檔案、多個大檔案三種按鈕功能可以選用,當伺服端電腦使用者先選定好的的檔案或資料夾,
將檔案名稱或資料夾資訊轉成檔案傳輸清單後,根據伺服端電腦使用者在選定列表中的clinet電腦,先把檔案傳輸清單在背景執行先傳送給選定的client端電腦,並且伺服端電腦的使用者要能確認clinet端電腦能接收後,當client端電腦接收到伺服端先傳來的檔案傳輸清單後,根據檔案傳輸清單,在client端程式啟動的位置建立一個資料夾來準備接收檔案,client端程式執行後,要回傳標準輸出資料給伺服端電腦程式並在背景執行,client端程式執行upd-reciver.exe執行期間終端畫面背景執行,
,伺服端電腦程式根據檔案傳輸清單接著等3秒讓clinet端電腦有時間完成接收檔案傳輸清單後,在背景呼叫udp-sender.exe檔用指令的方式執行,需加上依照伺服端選用的clinet電腦數量,在 send_file_list 函數中,我們根據選取的客戶端數量計算 min-receivers,即接收端的最小數量。使用 --min-receivers 設定最小接收端數量為 client_count(根據選定的客戶端數量動態設定)。加入 --autostart 參數,並設定為 5 秒,代表當有指定數量的接收端準備好後,自動啟動檔案傳輸,
檔案傳輸啟機後,client端電腦程式會在背景執行:
執行 udp-receiver.exe 並監控輸出進度。
傳送檔案名稱、大小、進度等資料給 server。
在檔案接收完成後,計算檔案的校驗碼並傳送給 server
接著,server 端需要監聽 client 端回傳的進度和校驗碼,並在 UI 中顯示進度、狀態及比對結果。
更新 Server 類別的程式碼來處理進度和校驗碼回報,
在伺服端電腦UI界面上,要能呈現傳輸狀態:目前傳輸檔案的資料(檔案名稱、檔案大小、校驗碼、傳輸速度、傳輸時間),最後在檔案傳輸完成後,要在UI界面上ALERT一個檔案傳輸完成提醒使用者,請依以上說明,設計出完整且實際使用的範例,謝謝
用udp-sender.exe指令來進行發出要求的client端電腦,開始傳輸檔案,,使用udp-sender.exe及udp-sender.exe的,"https://www.udpcast.linux.lu/exe.html",這個網站的程式,及"https://www.udpcast.linux.lu/satellite.html"這個網站的提示的指令及參數來進行設計實作,指定udp-sender.exe在執行時要udp-sender --file "從伺服端使用者傳送來的檔案傳輸清單" -r --destination client端電腦IP -w 伺服端使用者選擇的檔案 -b 128K -m 60M -l 10 -p 8600 ,最好能在傳送先在背景進行連接測試,如:udp-sender --file "從伺服端使用者的檔案傳輸清單" --dest client端電腦IP:8600 --test --interface 伺服端IP,請協助產生能實際使用的範例,謝謝