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