- 相關推薦
淺談基于多線程的網絡文件傳輸工具的改造論文
1 引言
如今,隨著計算機應用的普及,許多人也已經將進入Internet作為下一個計算機升級的目標,而用Internet進行文件傳輸,則是計算機聯入Internet的一個重要功能之一。因此各種文件傳輸系統便應運而生,如郵件,聊天工具等。這些軟件在使用上各有所長,但與此同時,其自身仍存在缺點和局限性,這些都給文件傳輸帶來了很多不便。首先,對遠程服務器的依賴導致有些文件傳輸工具不能完全實現點對點的文件傳輸,甚至對文件的安全造成了威脅。其次,這些傳輸工具只適宜傳輸體積較小的文件,如果傳輸的文件體積過大,則會耗費很長時間,進而導致資源的浪費,倘若網絡速度不理想,更有可能會導致傳輸中斷。因此,開發一個功能簡單,易于操作,傳輸效率高的文件傳輸工具勢在必行。
2 環境與相關開發技術
2.1 Sock網絡編程原理套接字(socket)是一種網絡編程接口,實際上就是一個通信端點,提供了發送和接收數據的機制。而Winsock是基于Windows操作系統下的網絡編程接口,也就是基于Socket模型的API。而最簡單的一對一的CS結構的通信程序,就只有兩個端點,即兩個套接字(Socket),一個在Server端,另一個在Client端,這兩個套接字就在CS間建立了雙向數據傳送的連接。每個套接字都有一個套接字地址,通常是IP和端口的組合。Socket分為阻塞模式和非阻塞模式:阻塞模式是指在指定套接字上調用函數執行操作時,在沒有完成操作之前,函數不會立即返回。例如,服務器程序在阻塞模式下調用accept()函數時將會阻塞服務器線程,直至接收到一個來自客戶端的連接請求。默認創建的套接字為阻塞模式。非阻塞模式是指在指定套接字上調用函數執行操作時,無論操作是否完成,函數都會立即返回。例如,在非阻塞模式下調用recv()函數時,程序會直接讀取網絡緩沖區中的數據,無論是否讀到數據,函數都會立即返回,而不會一直掛在此函數的調用上。在并發線程模型中,服務器程序中使用了一個線程來等待客戶端的連接請求,然后創建新線程與客戶端進行通信。因為每個客戶端都擁有一個專門的通信服務線程,所以能夠很及時地與服務器程序進行通信,不需要等待其他客戶端通信結束。因此本設計采用了socket的非阻塞模式。2.2 c/s結構C/S (Client/Server)結構,它是一種軟件系統體系結構,也就是客戶機/服務器結構。它可以充分利用兩端硬件環境的優勢,將任務合理分配到Client端和Server端來實現。C/S結構的基本原則是“功能分布”原則,也就是將計算機應用任務分解成多個子任務,由多臺計算機分工完成。客戶端完成數據處理,數據表示以及用戶接口功能;服務器端完成DBMS的核心功能。這種客戶請求服務、服務器提供服務的處理方式是一種新型的計算機應用模式。現在已經普遍采用3層C/S結構,與傳統的二層結構相比,三層C/S結構具有以下優點:首先,合理地劃分三層結構的功能,從而使整個系統的邏輯結構更為清晰,提高系統和軟件的可維護性和可擴展性;其次,可以更靈活地選用相應的平臺和硬件系統,應用的各層可以并行開發或者各自選擇最適合的開發語言。
3 文件傳輸工具的設計流程
3.1 文件傳輸工具的總體流程3.1.1 接收端的啟動創建監聽線程:(1)創建Socket,采用非阻塞模式。(2)通過bind()函數綁定IP地址和端口號。(3)通過listen()函數使其處于監聽狀態。3.1.2 發送端的連接(1)創建Socket。(2)通過connect()函數向接收端發送連接請求。3.2 文件傳輸工具的具體設計3.2.1 發送端(1)創建一個連接線程:1)創建socket()。2)根據用戶界面輸入的IP地址,調用connect()向接收端發出連接請求。3)連接建立后彈出對話框提示連接已建立。(2)選定文件后,創建一個對文件進行分包的線程:1)自定義一個合適的分包大小f_size。2)根據file.length得到文件的總大小,通過file.length/f_size求出該文件的分包數f_number。3)通過file.length%f_size求出該文件最后一包的大小flast_size。4)通過socket將文件基本信息(文件名f_name,文件大小f_size)和文件分包信息(分包大小f_size,分包數f_number,最后一包大小flast_size)發送給接收端。(3)創建一個發送文件數據的線程: sendThread() {WaitForMultipleEvents(); recv(); //接收分包信息 fseek(); //通過該函數將指針定位包信息所指的位置 send(); //發送分包數據 }3.2.2 接收端在第一個階段,接收端作為服務器,負責監聽客戶端提出的連接請求,并且用socket的非阻塞模式。(1)創建一個監聽線程:1)創建socket()。2)通過WSAEventselect()設置socket為非阻塞模式。3)通過bing()綁定主機IP地址和端口號。4)通過listen()使其處于監聽模式。5)通過循環while(1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);}使得發送端提出的連接請求能夠被馬上響應,并且新創建一個socket與發送端進行通信。注:監聽線程始終開啟,知道程序結束時才退出,全程監聽發送端的連接請求。(2)創建一個接收文件信息的線程:以步驟1中新創建的socket為該線程參數,通過調用recv()接收發送端發送的文件基本信息,并將文件名,文件大小顯示在界面上。(3)當接收端接收到該文件的基本信息后,創建一個函數,用來做接收文件的準備工作。(4)創建一個接收文件數據線程。(5)創建一個函數判斷文件是否接收完全。
4 主要實現技術
4.1 文件的分塊網絡應用程序是一種在不同系統的進程間通過網絡通信協議進行的進程間的通信問題。在Windows編程中是通過套接字socket來編程的,socket分為阻塞模式和非阻塞模式,本設計為了提高數據的傳輸效率采用了socket的非阻塞模式。當文件數據很大時,使用套接字socket進行傳輸往往需要花費較長的時間,容易出錯,因此我們將把文件分為N塊,進行數據的分塊傳輸。
4.2 文件的分塊傳輸在傳統算法中,sender將主動把分包后的數據塊依次傳送至receiver,而receiver只負責接收,但是由于sender并不能保證發送的數據塊receiver都已正確接收,所以需receiver發送確認信號,從而影響傳輸效率。因此在本設計中receiver將主動向sender索要分包數據,而sender只需按接收到的分包信息發送相應的分包數據即可,直至receiver發送接收完畢信息為止。因此,此次設計將分為兩大部分。第一部分:receiver作為服務器,sender作為客戶端。receiver創建socket后則處于監聽狀態,當sender發現有文件需要傳輸時則首先向receiver提出連接請求,receiver監聽到sender提出的連接請求后,馬上響應并創建新的socket與sender進行通信。連接成功建立后,sender向receiver發送文件的基本信息(包括分包信息),而receiver繼續循環監聽。第二部分:sender在發出文件信息后,充當服務器,監聽receiver。receiver接收到文件信息后,創建socket主動向sender發送分包信息索要分包數據,而sender接收到分包信息后將其解析并發送相應的分包數據。直至receiver檢測到所有分包數據都已接收,向sender發送結束信息。
4.3 確認所有分包都已接收為解決這個問題,將自定義一個分包信息結構體,其中包括分包ID,分包大小,以及分包的接收狀態(0:未接收,1:正在接收,2:已接受)。在sender進行文件分包時,會初始化文件信息,其中包括記錄文件的分包數,分包的固定大小,及最后一個分包的大小。同時也會初始化每個分包信息。receiver在接收到文件信息之后,根據文件信息中提供的分包數申請等大的分包信息緩存區。并初始化每個分包的接收狀態為0,表示尚未接收。當receiver取得分包ID并向sender發送時,修改此分包的接收狀態為1,表示正在接收。當receiver正確接收此分包后,修改分包接收狀態為2,表示已接收。當receiver判斷所有分包的接收狀態都為2時,即表示所有分包都已接收。4.4 多線程文件傳輸一個采用了多線程技術的應用程序可以更好地利用系統資源。其主要優勢在于充分利用了CPU的空閑時間片,可以用盡可能少的時間來對用戶的要求做出響應,使得進程的整體運行效率得到較大提高,同時增強了應用程序的靈活性。由于本設計采用的是Socket的非阻塞模式,采用多線程,可提高cpu利用率。于是,在文件的傳輸過程中,創建了3個線程,同時接收文件分包數據,創建線程后,一個應用程序可以同時有多個線程一起訪問,因此在設計中用了大量的信號量和事件機制,以避免訪存沖突。
5 具體實現過程
源程序的組成:在本設計中有兩個程序,分別為sender和receiver。sender主要有三個部分,一個是senderDlg,用于和用戶實現交互。負責在程序運行時創建MonitorImage線程,監聽文件緩沖區中的文件狀況,另外負責將選中的文件加入文件緩沖區中。同時還會在界面上顯示出文件的基本信息以及發送狀態。第二個是TransImageBuffer,主要用于初始化文件緩沖區,實現文件分包信息的添加和提取。第三個是ImageSender,用于實現文件的分包以及發送等。receiver中也包括三個部分:一個是receiverDlg,主要負責在程序開始運行時創建MonitorSender線程,監聽sender端的連接請求,一旦監聽到連接請求,則立即響應,之后循環監聽。另外會實時顯示文件的基本信息以及接收狀態。第二個是TransImageBuffer,同樣是用于初始化文件緩沖區,實現文件分包的添加和提取等。第三個是ImageReceiver,用于實現文件的分塊接收以及文件存儲等
6 總結
在編程之前,首先要對整個系統有一個很好的理解,對于系統的功能和需求分析透徹之后,利用軟件工程的思想,合理的進行開發設計。
【淺談基于多線程的網絡文件傳輸工具的改造論文】相關文章:
淺談網絡教育論文10-30
淺談通信網絡的論文05-05
淺談電網改造項目管理論文04-30
UNIX TCP/IP網絡文件傳輸的實現05-01
淺談基于生態倫理視角的生態休閑論文04-30
基于安全的通信網絡研究論文05-03
淺談網絡門派虛與實論文05-03
淺談基于翻轉課堂模式的語文教學論文04-27
淺談機床數控改造08-28
淺談公路改造設計05-02