Rex Mao

          分享java技術(shù)與生活

          JAVA文件傳輸程序

          這個是我做的另一個畢業(yè)設(shè)計,使用的最基本的socket通信實現(xiàn)文件傳輸,使用該程序可同時給多個人發(fā)送不同的文件并支持斷點續(xù)傳。
          由于只為畢業(yè)設(shè)計而寫的,只實現(xiàn)了功能,沒有在速度上優(yōu)化,發(fā)上來只為給要做類似程序的朋友做個參考。以下是畢業(yè)論文中的節(jié)選。

          源代碼已經(jīng)上傳了。

          3章      設(shè)計文檔

          31       任務(wù)概述

                 本項任務(wù)要開發(fā)一款P2P文件傳輸軟件,該軟件可以在局域網(wǎng)和互連上使用,具有文件傳輸,斷點續(xù)傳,多線程連接等功能。

          311      開發(fā)背景

                 隨著網(wǎng)絡(luò)的普及,在網(wǎng)絡(luò)中交換信息,特別是文件成為使用網(wǎng)絡(luò)時經(jīng)常性工作,現(xiàn)有的文件傳輸工具如QQMSN等,主要功能是作為即時通訊工具使用,而且在局域網(wǎng)中使用時仍需連接到互連網(wǎng)。本文開發(fā)的軟件基于P2P結(jié)構(gòu)實現(xiàn)文件傳輸,不依靠服務(wù)器維護用戶資料,所以,只要兩臺機器可以連通,就可以進行文件傳輸。

          312       定義

                 P2P:即peer-to-peer,可以理解為點對點,或?qū)Φ葌鬏數(shù)囊馑肌?/span>

          313       開發(fā)工具

                 開發(fā)采用JAVA語言,開發(fā)工具為jbuilder 2005

          32       文件傳輸業(yè)務(wù)流程

          321       通訊順序關(guān)系

                 在文件傳輸時,傳輸過程可以簡單的分為4步,如圖

          1、              由文件發(fā)送者發(fā)起文件傳輸,他首先發(fā)送文件名,文件大小,驗證消息等信息給文件接收者。

          2、              文件接收者收到文件信息和發(fā)送者信息,決定是否接收,如不接收,則發(fā)送拒絕接收消息給文件發(fā)送者,文件傳輸結(jié)束。如同意接收,發(fā)送同意接收消息和文件傳輸起始字節(jié)(用于斷點續(xù)傳)給發(fā)送者。

          3、              發(fā)送者開始發(fā)送文件數(shù)據(jù)包,直到最后一個文件數(shù)據(jù)包,發(fā)送者在最后一個文件數(shù)據(jù)包上加上標記。

          4、              接收者識別最后一個文件數(shù)據(jù)包,文件傳輸成功。


          322       文件發(fā)送端的詳細業(yè)務(wù)流程


           

          圖中顯示了發(fā)送文件時的詳細業(yè)務(wù)流程。

          1、首先,要選擇要發(fā)送的文件,可以選擇一個文件或同一個文件夾下的多個文件發(fā)送,當選擇多個文件時,軟件將為每個文件建立一個傳輸線程。選擇文件后,發(fā)送者要填寫目標IP和端口,由于是基于P2P的文件傳輸,不存在服務(wù)器維護好友列表,所以需要知道目標IP才能傳輸文件,用戶也可以填寫驗證消息用于描述自己的身份和文件的介紹。

          2、發(fā)送者收到確認包,判斷是否接收文件,如果不接收,則傳輸結(jié)束,如果接收,則打開要發(fā)送的文件,設(shè)置起始傳輸字節(jié)。

          3、發(fā)送者讀取一個文件片段,加入是否是最后一個文件片段的標志,打包發(fā)給接收者。

          4、發(fā)送完最后一個文件片段時,文件傳輸結(jié)束。

          323       文件接收者詳細業(yè)務(wù)流程


           

          1、 從一打開軟件開始,監(jiān)聽線程就會啟動,這時用戶就扮演者文件接收者的角色,當有文件發(fā)送者發(fā)來請求時,監(jiān)聽線程建立與發(fā)送者的連接,并創(chuàng)建傳輸線程,接收者得到發(fā)送者傳來的文件信息和驗證消息,用戶還能得到發(fā)送者的IP地址,用戶根據(jù)這些信息決定是否接收文件,并發(fā)送確認包給發(fā)送者,確認包里包含了是否接收的標志,和開始傳輸?shù)钠鹗甲止?jié)。

          2、 接收者開始接收數(shù)據(jù)包,解包,寫入文件中,直到最后一個文件片段,關(guān)閉文件,文件傳輸結(jié)束。

          33       軟件的傳輸協(xié)議設(shè)計

                 為了更好的控制文件傳輸?shù)牧鞒蹋_發(fā)設(shè)計了文件傳輸協(xié)議,該協(xié)議屬于應用層協(xié)議,為了不使傳輸過程過于復雜,協(xié)議盡量簡單設(shè)計。主要的內(nèi)容是傳輸包的格式。

          331       傳輸包的格式


           

          其中傳輸包的類型有3種:

          PACKAGE_TYPE_FILENAME = 0x01

          文件名包,該包用于文件發(fā)送者向接收者發(fā)送文件信息和驗證消息

          PACKAGE_TYPE_CONTEXT = 0x02

          文件內(nèi)容包,該包用于傳輸文件內(nèi)容

          PACKAGE_TYPE_CONFIRMRECEIVE = 0x03

          文件傳輸確認包,該包用于文件接收者向發(fā)送者確認文件的接收

          332       文件名包格式


           

          333      文件傳輸包格式

           

          其中MORE_DATA用于確認是否是文件片段的最后一個包,以結(jié)束文件的傳輸。0表示沒有數(shù)據(jù),1表示還有數(shù)據(jù)。

          3. 34      文件接受確認包格式


           

          其中CONFIRM_FLAG表示是否確認文件接收,1表示接收,0表示不接收,當接收時,OFF表示文件傳輸?shù)钠鹗甲止?jié),用來實現(xiàn)斷點續(xù)傳。

          3.4       文件傳輸?shù)臓顟B(tài)機

          文件傳輸線程的地層其實就是一個狀態(tài)轉(zhuǎn)換機,線程具有幾個狀態(tài),線程從文件名傳輸狀態(tài)開始,根據(jù)文件傳輸?shù)牟煌闆r,在各個狀態(tài)間轉(zhuǎn)換,直到傳輸成功或傳輸失敗。

          FILE_TRANS_STATUS_FILENAME = 0x01

          文件名稱傳輸狀態(tài),文件傳輸剛建立連接時,傳輸狀態(tài)處于文件名傳輸狀態(tài)

          FILE_TRANS_STATUS_CONTEXT = 0x02

          文件內(nèi)容傳輸轉(zhuǎn)臺,在傳輸文件內(nèi)容時,傳輸狀態(tài)屬于該狀態(tài)

          FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03

          等待確認狀態(tài),文件發(fā)送者,發(fā)送完文件信息和驗證消息后,處于該狀態(tài),文件接收者接收到文件信息和驗證消息后處于該狀態(tài)

          FILE_TRANS_STATUS_SUCCESS = 0x04

          文件傳輸成功狀態(tài),表示文件已成功傳輸完畢

          FILE_TRANS_STATUS_FAIL = 0x05

          文件傳輸失敗狀態(tài),表示文件傳輸已經(jīng)失敗,失敗原因可能是對方取消了文件傳輸或網(wǎng)絡(luò)錯誤




           

          3.5        結(jié)構(gòu)設(shè)計

          軟件主要由MainFrame,TransFileManager,SocketThread,Server,TransFilePanel五個類構(gòu)成圖 表示了這幾個類之間的關(guān)系。


           

          類功能介紹

          MainFrame

          MainFrame類是軟件的主界面類,負責與用戶的交互。

          TransFileManager

          TransFileManager類是文件傳輸?shù)目刂祁悾撠煿芾砦募膫鬏敚S護一個傳輸線程(SocketThread)的列表,每個線程都表示一個正在傳輸?shù)娜蝿?wù)。TransFileManager類定時的掃描各個線程的狀態(tài),根據(jù)不同狀態(tài)做出不同處理,如計算傳輸速度,顯示傳輸進度等。

          SocketThread

          SocketThread類是文件傳輸線程類,它負責底層的具體傳輸工作,包括打包與解包,并且轉(zhuǎn)換自己的狀態(tài),完成文件的傳輸。

          Server

          Server類是為TransFileManager類使用的,它負責本地端口的監(jiān)聽,一旦有用戶連接,TransFileManager就創(chuàng)建一個傳輸線程,放入線程列表。而它繼續(xù)監(jiān)聽端口。

          TransFilePanel

          TransFilePanel是一個面板,它用有按鈕、進度條,標簽等用來顯示文件的傳輸狀態(tài)。

          3.6        類設(shè)計

          361       MainFrame

          該類是視圖類,是軟件的主界面。

           

          成員變量:

          contentPane

          contentPaneJPanel類的對象,是主界面的面板。

          jbtnSend

          jbtnSendJButton類對象,點擊它將打開文件傳輸對話框。

          jbtnSetting

          jbtnSettingJButton類對象,點擊它將打開設(shè)置對話框。

          jlblIP

          jlblIPJLable類對象,它顯示本機的IP地址,方便文件的傳輸。

          jtpTransFile

          jtpTransFileJTabbedPane類對象,是選項卡控件,用于顯示多個文件同時傳輸。

          tfm

          tfmTransFileManager類對象,負責控制文件的傳輸。

          成員方法:

          jbtnSend_anctionPerformed()

          該方法為jbtnSend按鈕的點擊事件

          jbtnSetting_actionPerformed()

          該方法為jbtnSetting按鈕的點擊事件

          This_windowClosed()

          該方法為窗口關(guān)閉事件

          界面截圖:


           

          362       TransFileManager

          該類負責傳輸過程中對各個傳輸線程的檢測與控制。


           

          成員變量:

          jtp

          jtp是選項卡控件對象,是MainFrame類中jtpTransFile對象的一個引用。

          panelist

          paneListArrayList類對象,它是一個鏈表結(jié)構(gòu),存儲使用的選項卡。

          running

          running是一個boolean型的對象,用來表示線程是否在執(zhí)行。

          s

          sServer類的對象,用來堅聽本地端口,等待用戶的連接。

          threadList

          threadListArrayList類對象,它是一個鏈表結(jié)構(gòu),存儲使用的傳輸線程。

          maxThreadNum

          maxTreadNum是整型變量,表示最大允許的線程數(shù)。

          port

          port是整型變量,表示使用的端口號。

          成員方法:

          close()

          該方法用于關(guān)閉文件傳輸?shù)目刂啤?/span>

          sendFile()

          該方法用于建立一個文件發(fā)送,要求輸入?yún)?shù)為,目標IP,端口號,要發(fā)送的文件和驗證消息。

          3.6.3           SocketThread

          SocketThread類是文件傳輸?shù)牡讓又С诸悾峁┪募鬏數(shù)姆?wù)。


           

          成員變量:

          sendBuf

          sendBuf是一個字節(jié)型數(shù)據(jù),它是文件發(fā)送和接收時的緩沖區(qū)。

          dis

          disDataInputStream型對象,它是由Socket對象得到的輸入流。

          dos

          dosDataOutputStream型對象,它是由Socket對象得到的輸出流。

          fDis

          fDisDataInputStream型對象,它是要發(fā)送的文件的輸入流。

          raf

          rafRandomAccessFile型對象,該對象允許設(shè)置輸出流的位置,以支持斷點續(xù)傳。

          running

          running是一個boolean型對象,用來表示線程是否在執(zhí)行。

          serverName

          serverName是字符串型對象,表示服務(wù)器的地址,該對象只有在線程作為發(fā)送者時使用。

          errorMessage

          errorMessage是字符串型對象,表示出錯的信息。

          fileName

          fileName是字符串型對象,表示文件名。

          fileSender

          fileSender是一個boolean型對象,表示是文件發(fā)送者還是文件接收者。

          IP

          IP是字符串型對象,用來存放目的機的IP地址。

          message

          message是字符串型對象,用來表示驗證信息。

          port

          port是整型變量,表示連接的端口號。

          transFileLength

          transFileLength是長整型變量,表示已經(jīng)傳輸?shù)奈募L度,TransFileManager可以用它來計算傳輸進度和傳輸速度

          成員方法:

          cancelTrans()

          該方法用于取消傳輸

          confirmReceiveFile()

          該方法用于確認傳輸文件

          參數(shù)flag用來表示是否同意傳輸

          參數(shù)fileName用來表示保存的文件

          參數(shù)off用來表示起始傳輸字節(jié)

          getFileTransMessage()

          該方法用于得到文件傳輸?shù)幕拘畔ⅰH纾何募l(fā)送的目標,端口號等。

          getStatus()

          該方法返回一個整型變量,表示當前線程的傳輸狀態(tài)。

          run()

          線程的執(zhí)行方法,該方法中循環(huán)執(zhí)行發(fā)送或接收方法,完成文件的發(fā)送或接收。

          setError()

          該方法通過一個字符串型的參數(shù)設(shè)置錯誤信息。

          stopThread()

          該方法用于停止線程的執(zhí)行。

          doPackage()

          打包方法,該方法中,根據(jù)線程所處的不同狀態(tài),對數(shù)據(jù)加入不同的包頭和其他信息,進行打包。

          readFromFile()

          該方法從要發(fā)送的文件中讀取一個整型數(shù)。

          readFromSocket()

          該方法從Socket輸入流讀取一個整型數(shù),它有一個重載版本讀取一個字節(jié)數(shù)組的數(shù)據(jù)。

          receiveFile()

          該方法為接收文件的方法,是線程循環(huán)中,文件接收者執(zhí)行的方法。

          sendFile()

          該方法為發(fā)送文件方法,是線程循環(huán)中,文件發(fā)送者執(zhí)行的方法。

          writeToFile()

          該方法寫一個字節(jié)數(shù)據(jù)的數(shù)據(jù)到保存的文件中。

          writeToSocket()

          該方法寫數(shù)據(jù)到Socket輸出流中,它有三個重載版本,分別是寫入整型數(shù),寫入長整型數(shù)和寫入字節(jié)數(shù)組數(shù)據(jù)。

          3.6.3            TransFilePanel

          這個類屬于視圖類,它作為主界面上的一個對象使用,含有進度條,按鈕,標簽的對象,用于顯示文件傳輸狀態(tài),每一個傳輸線程都擁有自己的TransFilePanel類對象。


           

          成員變量:

          fileName

          fileName是一個字符串,表示傳輸文件的文件名。

          fileSender

          fileSenderboolean型對象,表示是文件發(fā)送者還是接收者。

          isCanneled

          isCanneledboolean型對象,傳輸過程中,用戶點了取消按鈕后,該標志位置trueTransFileManager會循環(huán)檢測isCanneled標志,當發(fā)現(xiàn)其為true后,它會關(guān)閉對應的傳輸線程,而對方會檢測到傳輸錯誤,文件傳輸就停止了。

          isClosed

          isClosedboolean型對象,它表示當傳輸過程已經(jīng)停止時,用戶點擊了關(guān)閉按鈕,TransFileManager檢測到isClosedtrue時,會在列表中去掉對應的傳輸線程和TransFilePanel

          isConfirm

          isConfirmboolean型對象,它表示文件接收者是否確認了文件接收后(包括同意和拒絕),TransFileManager檢測到isConfirmtrue時,會將確認狀態(tài)發(fā)給文件發(fā)送者。

          jbtnCannel

          jbtnCannel是取消按鈕。

          jbtnOK

          jbtnOK是確定按鈕。

          jpgbFileTrans

          jpgbFileTrans是文件傳輸?shù)倪M度條。

          jtaFileTransStatus

          jtaFileTransStatus是一個文本框,用來顯示文件傳輸?shù)臓顟B(tài)。

          transFileLength

          transFileLength是一個長整型變量,用來表示已經(jīng)傳輸?shù)奈募L度。

          status

          status是一個整行變量,表示文件傳輸?shù)臓顟B(tài),所表示的狀態(tài)與SocketThread中的對應。

          界面截圖


           

          3.7              算法介紹

          371 TransFileManager的循環(huán)監(jiān)聽

          TransFileManger類繼承了Thread類,實現(xiàn)多線程,避免循環(huán)監(jiān)聽時產(chǎn)生阻塞。

          以下是在每次循環(huán)中做的工作

          1、 得到傳輸線程(SocketThread)的數(shù)量和傳輸狀態(tài)顯示面板(TransFilePanel)的數(shù)量。

          2、 從傳輸線程列表中依次取出一個傳輸線程。

          3、 判斷當前取出的線程是否有對應的傳輸狀態(tài)顯示面板,如果有執(zhí)行5,如果沒有執(zhí)行4

          4、 增加傳輸狀態(tài)顯示面板,并且在主界面上增加選項卡。

          5、 判斷傳輸線程的狀態(tài),根據(jù)不同的狀態(tài)做不同的處理。

          6、 如果列表中的線程取完,執(zhí)行1,沒有取完執(zhí)行2

          程序流程圖:



           

          372 斷點續(xù)傳

          軟件支持斷點續(xù)傳的功能,該功能主要算法如下:

          1、 當文件傳輸中途停止時,文件接收者程序為接收的文件創(chuàng)建一個以該文件名+.tmp為文件名的臨時文件,臨時文件與該文件保存在同一個路徑下。臨時文件中保存文件以傳輸?shù)淖止?jié)數(shù)和文件的大小。

          2、 當文件接收者接收該文件時,如果有對應的臨時文件,程序會檢測到該文件的臨時文件,讀取以傳輸?shù)淖止?jié)數(shù)和文件大小,并且比較傳輸?shù)淖止?jié)數(shù)與未完成傳輸?shù)奈募笮∈欠裣嗟龋募笮『桶l(fā)送來的文件大小是否相等,如果都相等,執(zhí)行3,否則執(zhí)行4

          3、 將文件的輸出流設(shè)置到應該繼續(xù)傳輸?shù)奈恢茫⑵鹗紓鬏斪止?jié)數(shù)發(fā)給發(fā)送者,執(zhí)行5

          4、 如果有未完成的傳輸文件,將其刪除,執(zhí)行5

          5、 進行文件傳輸。

          程序流程圖:




           

          3.7.3            本地端口的多連接監(jiān)聽

          Server類對象負責本地端口的監(jiān)聽,可以支持多了連接,具體數(shù)量由用戶設(shè)置。

          1、  用用戶設(shè)置的端口創(chuàng)建監(jiān)聽,等待連接。

          2、  當有用戶連接上后,用該連接創(chuàng)建一個SocketThread傳輸線程,加入到線程列表。

          3、  如果停止監(jiān)聽則退出,否則執(zhí)行1

          程序流程圖:

          posted on 2007-11-03 11:19 Rex Mao 閱讀(13606) 評論(5)  編輯  收藏 所屬分類: 技術(shù)

          評論

          # re: JAVA文件傳輸程序 2010-04-05 16:33 輕帆向南

          太感謝了~~目前正在做相關(guān)的一個項目,我想下載下來學習一下
          可是源代碼找不到啊,能提供一份嗎?
          謝謝哈~郵箱dong1028@gmail.com  回復  更多評論   

          # re: JAVA文件傳輸程序 2012-06-04 17:14 編程狂男

          非常感謝,我目前正在做類似的項目,想學習一下,能提供一份源代碼嗎?謝謝!郵箱kaiwen0930@gmail.com!  回復  更多評論   

          # re: JAVA文件傳輸程序 2012-12-04 20:17 欠世

          最近在做socket上的文件傳送,不知道該怎么判斷一個文件的結(jié)束,希望樓主可以個我發(fā)份源代碼,學習一下。謝謝了!  回復  更多評論   

          # re: JAVA文件傳輸程序 2012-12-04 20:18 欠世

          最近在做socket上的文件傳送,不知道該怎么判斷一個文件的結(jié)束,希望樓主可以個我發(fā)份源代碼,學習一下。謝謝了!忘了留郵箱了 puxuanling@163.com  回復  更多評論   

          # re: JAVA文件傳輸程序 2013-08-16 14:40 wenwen

          求代碼學習,827970893@qq.com  回復  更多評論   

          主站蜘蛛池模板: 宽甸| 铁岭市| 兴业县| 西吉县| 嘉义市| 彭水| 乐山市| 宁陕县| 砀山县| 常德市| 米林县| 方正县| 衡南县| 南溪县| 垫江县| 宣恩县| 盐边县| 扶沟县| 绿春县| 柘城县| 徐汇区| 淳化县| 东兰县| 南昌县| 神池县| 文山县| 利辛县| 塔河县| 屯昌县| 根河市| 马龙县| 德惠市| 隆回县| 区。| 突泉县| 铜陵市| 洪泽县| 瑞昌市| 偃师市| 商水县| 东平县|