網路程式設計 基於TCP的多檔案傳輸程式(二)

2021-07-24 22:27:48 字數 2385 閱讀 5566

前一期文章:網路程式設計 基於socket的多檔案傳輸程式實現(一)

[3.1]工具類

工具類中除了存放之前的說明的findfile()方法之外,還可以將client類與server類都需要的xml檔案相關讀取方法封裝在一起存放於此.

public static mapreaderxml(string filepath)

使用dom4j包中的相關api配合jaxen包的xpath讀取xml檔案,並將需要的資料以鍵值對的形式存入map集合返回.

[3.2]client類

對於客戶端類而言,之前在它們的連線和資料傳輸中分析了socket物件的建立和基本的io流操作流程.

現在已經可以從檔案中讀出需要的配置屬性,因此在構造方法中我們可以在init()方法中拋棄固定值不變的host和port,由靜態方法readerxml()方法從配置檔案中讀取的map集合中獲取.

在檔案的讀寫和資料傳輸階段,將所有的步驟封裝進一條執行緒之中

只有當伺服器傳回」get file name」代表著伺服器已經做好了讀取檔案資料的準備,開始進行當前檔案傳輸.在

這之前,程式不允許對檔案進行任何讀取和傳輸.以免對客戶端造成資料汙染.同理,在當前檔案傳輸完畢後,需要接收到伺服器端傳輸的」file copy ok」的訊號,否則不進行下乙份檔案的傳輸讀寫,防止兩端讀寫檔案不一致,導致copy失敗.

在進行檔案讀寫的過程中,為了突出客戶端與服務端的檔案讀寫順序的控制邏輯,將檔案實際讀寫與傳輸資料的行為進行封裝.

[3.3]server類

與客戶端類相同,在完成了配置屬性的檔案流讀寫後,我們可以在客戶端物件的生成中拋棄固定的屬性,使用可以根據實際需要在配置檔案中進行更改的可變屬性.

在與客戶端的連線控制傳輸的邏輯中,服務端啟動傳輸並返回」get file name」訊號給客戶端示意可以開始檔案傳輸的前提是正確的接收到客戶端傳送的檔名(filename)並以此建立了對應的檔案副本和待傳輸檔案長度(length)之後. 為了客戶端的執行邏輯的正確性,即使服務端接收了錯誤的資訊,也需要向客戶端反饋提示客戶端傳輸」error」錯誤資訊. 防止客戶端在傳出資訊後無法接收到有效的反饋資訊.

服務端的需要正確的讀取客戶端傳送的資料,並將它們寫入到準備好的存於服務端的對應檔案中,資料的正確性和完整性有tcp傳輸協議的保證.

我們需要做的是控**務端檔案接收的判斷邏輯.

在正確的接收檔案資訊並建立了對應的copy檔案後,客戶端的待傳輸檔案開始了檔案資料讀取和傳輸.

客戶端判斷當前檔案傳輸完畢後會進行乙個while語句等待伺服器端傳輸正確讀寫完畢的訊號,才進行下乙份檔案傳輸.

而在伺服器端的輸入流不是傳統的檔案輸入流,我們無法正確的根據輸入的值判斷當前檔案是否讀寫完畢.

此時需要借助之前的檔案長度length進行輔助判斷當前檔案是否寫入完畢.每次檔案寫入一組位元組時,將位元組長度存入乙個變數中,判斷儲存總計寫入長度的變數與檔案原始長度變數值進行比較,判斷當前檔案是否寫入完畢.

當當前檔案寫入完畢後,跳出寫入迴圈向客戶端傳送一則寫入完畢的資訊」file copy ok」,提示伺服器端當前檔案已經讀寫完畢,可以進行下乙份檔案的讀寫.

至此乙個簡單的控制台版的多檔案傳輸系統就基本完畢了,確實是很簡陋.有方法的封裝選擇不正確,而有些方法又過於臃腫,文章中的類與方法的分類與程式中有些許的出入,這是由於書寫總結也是乙個反思優化的過程,有些部分是之前編寫時沒有考慮完善或是不盡如人意的,在寫部落格時,下意識進行了一定程度上的優化和改善.

程式本身除了需要進行結構優化和改善外,功能其實也可以進行進一步的開發.比如:

1. 在配置檔案中新增讀寫資料夾的位址資訊,使用者可以在外部手動更改希望傳輸的資料夾和儲存的資料夾.

2. 為客戶端和伺服器端新增視覺化操作介面,進一步的簡化操作,無需在ide執行,無需在配置檔案更改配置

等等…

基於TCP的檔案傳輸

伺服器端處理客戶請求 public class serverthread extends thread override public void run file file new file directory.getabsolutepath file.separatorchar filename ...

tcp檔案傳輸

include include include include include include include include define buffer size 100 1024 1024 define file name max size 512 intmain int argc,char a...

VC 網路程式設計 檔案傳輸

在socket程式設計中,以前學習的時候都是簡單的字元傳輸,而在實際的應用中,經常需要傳輸檔案,其實網路上的檔案傳輸都是先把資料轉化為位元組流,當然,最底層的是01二進位制資料的傳輸,但是這部在我們討論範圍之內,其實現在還只是研究小檔案怎麼傳輸,當檔案很大時,需要用到斷點續傳。好了,要傳輸檔案,首先...