計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告簡單FTP服務(wù)器實(shí)現(xiàn)_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告簡單FTP服務(wù)器實(shí)現(xiàn)_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告簡單FTP服務(wù)器實(shí)現(xiàn)_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告簡單FTP服務(wù)器實(shí)現(xiàn)_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告簡單FTP服務(wù)器實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告學(xué) 院: 專 業(yè): 班 級: 設(shè)計(jì)題目: 簡單ftp服務(wù)器實(shí)現(xiàn) 組 長:組 員 指導(dǎo)教師: 成 績: 時(shí) 間: 2014至 2015學(xué)年度 第 1 學(xué)期9月25日至10月30日簡單ftp服務(wù)器實(shí)現(xiàn)1 關(guān)鍵技術(shù)1.1 ftp協(xié)議ftp的目標(biāo)是提高文件的共享性,提供非直接使用遠(yuǎn)程計(jì)算機(jī),使存儲(chǔ)介質(zhì)對用戶透明和可靠高效地傳送數(shù)據(jù)。圖1 ftp 服務(wù)示意圖在開始階段,標(biāo)準(zhǔn)ftp命令由用戶pi產(chǎn)生并通過控制連接傳送到服務(wù)器進(jìn)程。服務(wù)器pi向用戶pi返回標(biāo)準(zhǔn)應(yīng)答。ftp命令指定數(shù)據(jù)連接參數(shù)和文件系統(tǒng)操作。用戶dtp在特定數(shù)據(jù)端口偵聽,服務(wù)器開始數(shù)據(jù)連接并以指定的參數(shù)開始數(shù)據(jù)傳輸。數(shù)據(jù)

2、端口不必在開始ftp命令的機(jī)器上,但用戶或用戶ftp進(jìn)程必須確定它在指定的數(shù)據(jù)端口上偵聽。這個(gè)數(shù)據(jù)連接是全雙工的。ftp協(xié)議中對應(yīng)答碼的意義有明確的規(guī)定,如下表所示: 表1 ftp協(xié)議應(yīng)答碼應(yīng)答碼意義應(yīng)答碼意義110重新啟動(dòng)標(biāo)記應(yīng)答。在這種情況下文本是確定的,它必須是:mark yyyy=mmmm,其中yyyy是用戶進(jìn)程數(shù)據(jù)流標(biāo)記,mmmm是服務(wù)器標(biāo)記。120服務(wù)在nnn分鐘內(nèi)準(zhǔn)備好125數(shù)據(jù)連接已打開,準(zhǔn)備傳送150文件狀態(tài)良好,打開數(shù)據(jù)連接200命令成功202命令未實(shí)現(xiàn)211系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)212目錄狀態(tài)213文件狀態(tài)214幫助信息,信息僅對人類用戶有用215名字系統(tǒng)類型220對新用

3、戶服務(wù)準(zhǔn)備好221服務(wù)關(guān)閉控制連接,可以退出登錄225數(shù)據(jù)連接打開,無傳輸正在進(jìn)行226關(guān)閉數(shù)據(jù)連接,請求的文件操作成功227進(jìn)入被動(dòng)模式230用戶登錄250請求的文件操作完成257創(chuàng)建pathname331用戶名正確,需要口令332登錄時(shí)需要帳戶信息350請求的文件操作需要進(jìn)一步命令421不能提供服務(wù),關(guān)閉控制連接425不能打開數(shù)據(jù)連接426關(guān)閉連接,中止傳輸450請求的文件操作未執(zhí)行451中止請求的操作:有本地錯(cuò)誤452未執(zhí)行請求的操作:系統(tǒng)存儲(chǔ)空間不足500格式錯(cuò)誤,命令不可識別501參數(shù)語法錯(cuò)誤502命令未實(shí)現(xiàn)503命令順序錯(cuò)誤504此參數(shù)下的命令功能未實(shí)現(xiàn)530未登錄532存儲(chǔ)文件需

4、要帳戶信息550未執(zhí)行請求的操作551請求操作中止:頁類型未知552請求的文件操作中止,存儲(chǔ)分配溢出553未執(zhí)行請求的操作:文件名不合法1.2 tcp協(xié)議的編程socket(套接字)是通信的基石,是支持tcp/ip協(xié)議的網(wǎng)絡(luò)通信的基本操作單元??梢詫ocket看作不同主機(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn),它構(gòu)成了單個(gè)主機(jī)內(nèi)及整個(gè)網(wǎng)絡(luò)間的編程界面。socket存在于通信域中,通信域是為了處理一般的線程通過socket通信而引進(jìn)的一種抽象概念。socket通常和同一個(gè)域中的socket交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序)。各種進(jìn)程使用這個(gè)相同的域互相之間用interne

5、t協(xié)議簇來進(jìn)行通信。2 功能設(shè)計(jì)2.1 功能示意圖服務(wù)器端客戶端驗(yàn)證登陸鏈接下載登陸上傳下載刪除主動(dòng)被動(dòng)圖2 實(shí)現(xiàn)功能示意圖以ftp的工作原理和權(quán)限歸屬為基礎(chǔ),用c#語言編寫程序,用簡單界面展示,用socket編程和二進(jìn)制輸入輸出流來實(shí)現(xiàn)了ftp文件上傳,下載,刪除,讀取文件列表這幾項(xiàng)功能。采用端口為21和ip地址為連接。3 代碼實(shí)現(xiàn)3.1 啟動(dòng)服務(wù)器(服務(wù)器端)/ 啟動(dòng)服務(wù)器 private void btnftpserverstartstop_click(object sender, eventargs e) if (mytcplistener = null) liste

6、nthread = new thread(listenclientconnect); listenthread.isbackground = true; listenthread.start(); lstboxstatus.enabled = true; lstboxstatus.items.clear(); lstboxstatus.items.add(已經(jīng)啟動(dòng)ftp服務(wù).); btnftpserverstartstop.text = 停止; else mytcplistener.stop(); mytcplistener = null; listenthread.abort(); lstb

7、oxstatus.items.add(ftp服務(wù)已停止!); lstboxstatus.topindex = lstboxstatus.items.count - 1; btnftpserverstartstop.text = 啟動(dòng); / 使用數(shù)據(jù)連接發(fā)送文件流(客戶端發(fā)送下載文件命令) private void sendfilebyusersession(user user, filestream fs) addinfo(向用戶發(fā)送(文件流):.); try if (user.isbinary) byte bytes = new byte1024; binaryreaderbinaryrea

8、der=new binaryreader(fs); intcount=binaryreader.read(bytes,0, bytes.length); while (count 0) user.datasession.binarywriter.write(bytes, 0, count); user.datasession.binarywriter.flush(); count = binaryreader.read(bytes, 0, bytes.length); else streamreader streamreader = new streamreader(fs); while (s

9、treamreader.peek() -1) user.datasession.streamwriter.writeline(streamreader.readline(); addinfo(.發(fā)送完畢!); finally user.datasession.close(); fs.close(); 3.2 文件傳輸操作(客戶端)由于代碼過多且相似,以顯示文件目錄和上傳文件為例。/ 處理并顯示文件目錄列表 string ftpdir = s.split(environment.newline.tochararray(), stringsplitoptions.removeemptyentrie

10、s); int length = 0; for (int i = 0; i ftpdir.length; i+) if (ftpdiri.endswith(.) length = ftpdiri.length - 2; for (int i = 0; i ftpdir.length; i+) s = ftpdiri; int index = s.lastindexof(t); if (index = -1) if (length s.length) index = length; else continue; string name = s.substring(index + 1); if (

11、name = . | name = .) continue; / 判斷是否為目錄,在名稱前加目錄來表示 if (s0 = d | (s.tolower().contains() string namefield = name.split( ); int namefieldlength = namefield.length; string dirname; dirname = namefieldnamefieldlength - 1; / 對齊 dirname = dirname.padright(34, ); name = dirname; / 顯示目錄 lstbxftpresources.i

12、tems.add(目錄 + name); for (int i = 0; i ftpdir.length; i+) s = ftpdiri; int index = s.lastindexof(t); if (index = -1) if (length s.length) index = length; else continue; string name = s.substring(index + 1); if (name = . | name = .) continue; / 判斷是否為文件 if (!(s0 = d | (s.tolower().contains() string na

13、mefield = name.split( ); int namefieldlength = namefield.length; string filename filename = namefieldnamefieldlength - 1; / 上傳文件到服務(wù)器事件 private void btnupload_click(object sender, eventargs e) / 選擇要上傳的文件 openfiledialog openfiledialog = new openfiledialog(); openfiledialog.filename = openfiledialog.fi

14、lenames.tostring(); openfiledialog.filter = 所有文件(*.*)|*.*; if (openfiledialog.showdialog() != dialogresult.ok) return; fileinfo fileinfo = new fileinfo(openfiledialog.filename); try string uri = geturistring(fileinfo.name); ftpwebrequest request = createftpwebrequest(uri, webrequestmethods.ftp.uploa

15、dfile); request.contentlength = fileinfo.length; int buflength = 8196; byte buffer = new bytebuflength; filestream filestream = fileinfo.openread(); stream responsestream = request.getrequeststream(); lstbxftpstate.items.add(打開上傳流,文件上傳中.); int contenlength = filestream.read(buffer, 0, buflength); wh

16、ile (contenlength != 0) responsestream.write(buffer, 0, contenlength); contenlength = filestream.read(buffer, 0, buflength); responsestream.close(); filestream.close(); ftpwebresponse response = getftpresponse(request); if (response = null) lstbxftpstate.items.add(服務(wù)器未響應(yīng).); lstbxftpstate.topindex =

17、lstbxftpstate.items.count - 1; return; lstbxftpstate.items.add(上傳完畢,服務(wù)器返回: + response.statuscode + + response.statusdescription); lstbxftpstate.topindex = lstbxftpstate.items.count - 1; messagebox.show(上傳成功!); / 上傳成功后,立即刷新服務(wù)器目錄列表 showftpfileanddirectory(); catch (webexception ex) lstbxftpstate.items

18、.add(上傳發(fā)生錯(cuò)誤,返回信息為: + ex.status); lstbxftpstate.topindex = lstbxftpstate.items.count - 1; messagebox.show(ex.message, 上傳失敗); 4 實(shí)例演示首先在f:盤下新建文件夾計(jì)科112,在其中創(chuàng)建目錄結(jié)構(gòu)并放一些文件資源,例如圖片,文檔等。運(yùn)行ftp服務(wù)器程序,然后點(diǎn)擊“啟動(dòng)”按鈕后就啟動(dòng)了ftp服務(wù)器,運(yùn)行結(jié)果如下圖所示。圖3 ftp服務(wù)器啟動(dòng)ftp服務(wù)器程序中已經(jīng)初始化用戶名和密碼,直接輸入用戶名和密碼為19211203和19211205后點(diǎn)擊“登錄”按鈕后就完成了用戶驗(yàn)證的過程,并與ftp服務(wù)器建立了控制連接和數(shù)據(jù)連接。運(yùn)行結(jié)果如下圖:圖4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論