文件傳輸程序設計_第1頁
文件傳輸程序設計_第2頁
文件傳輸程序設計_第3頁
文件傳輸程序設計_第4頁
文件傳輸程序設計_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Internet網(wǎng)絡程序設計實驗報告基于Socket的文獻傳輸程序設計姓名:莫敵班級:軟件0904學號:U17895指導老師:陸永忠.03.31目錄1 實驗目的及規(guī)定 21.1 實驗目的 21.2 實驗規(guī)定 22 實驗環(huán)境 33 實驗程序設計 33.1 設計思想 33.2 程序設計流程框圖 43.3 具體設計 53.3.1 界面設計 53.3.2 重要功效實現(xiàn) 63.4 運行成果 94 實驗感想 11實驗目的及規(guī)定實驗目的熟悉Socket的通訊機制,理解網(wǎng)絡程序的設計辦法。重點掌握基于TCP合同的Socket網(wǎng)絡編程。實驗規(guī)定設計界面,在服務器端和客戶端傳輸圖片和文獻。如果是圖片請顯示該圖片,如果是其它文獻,則保存。實驗環(huán)境編譯環(huán)境:Windows7+VisualStudio使用MFC編寫。運行環(huán)境:Windows7操作系統(tǒng)。實驗程序設計設計思想根據(jù)實驗的規(guī)定:在服務器和客戶端之間傳輸文獻和圖片,則需要程序提供一種可靠的網(wǎng)絡傳輸服務來確保文獻在傳輸過程中無丟失、損壞。在分析了傳輸層合同TCP合同和UDP合同后,理解到TCP合同提供的是一種面對連接的、可靠的字節(jié)流服務,而UDP合同提供的是一種無連接的、不可靠的數(shù)據(jù)報服務。由于程序的需求,即必須確保文獻傳輸?shù)目煽啃裕谑?,我采用基于TCP合同的Windowssockets來設計實現(xiàn)本實驗。程序設計流程框圖創(chuàng)立新的通信端點創(chuàng)立新的通信端點將一種本地地址關(guān)聯(lián)到套接字上宣布接受連接,給出監(jiān)聽隊列大小阻塞,直到有客戶企圖連接發(fā)送/接受數(shù)據(jù)釋放連接結(jié)束開始主動嘗試建立一種連接創(chuàng)立新的通信端點發(fā)送/接受數(shù)據(jù)釋放連接結(jié)束開始服務器端客戶端圖1程序設計流程框圖具體設計基于TCP的socket編程流程:服務器端:創(chuàng)立套接字(socket)。將套接字綁定到一種本地地址和端口上(bind)。將套接字設為監(jiān)聽模式,準備接受客戶端請求(listen)。等待客戶端請求到來。當請求到來后,接受連接請求,返回一種新的對應于本次連接的套件字(accept)。用返回的套接字和客戶端進行通信(send/recv)。返回,等待另一客戶端請求。關(guān)閉套接字??蛻舳耍簞?chuàng)立套接字(socket)。向服務器發(fā)出連接請求(connect)。和服務器端進行通信(send/recv)。關(guān)閉套接字。界面設計圖2程序界面由于程序?qū)崿F(xiàn)的功效單一簡樸,因此我的程序界面設計如圖2所示。程序由兩個顧客可操作的控件構(gòu)成:IP地址控件,顧客輸入將要接受文獻的接受方IP地址;“發(fā)送文獻”按鈕,單擊選擇顧客要發(fā)送的文獻并發(fā)送所選文獻數(shù)據(jù)。重要功效實現(xiàn)套接字庫加載:AfxSocketInit()接受線程:UINTRecvProc(LPVOIDpParam){ while(TRUE) { CSockettmpSock; CSocketservSock; tmpSock.Create(5000); tmpSock.Listen(1); tmpSock.Accept(servSock); charfileNameRecv[500]={0}; inta=servSock.Receive(fileNameRecv,500); CFileDialogsaveDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "全部文獻(*.*)|*.*||"); saveDlg.m_ofn.lpstrFile=fileNameRecv; if(IDOK==saveDlg.DoModal()) { CFilerecvFile; CStringrecvPathName; recvPathName=saveDlg.GetPathName(); recvFile.Open(recvPathName,CFile::modeCreate|CFile::modeWrite); UINTuiLength; servSock.Receive(&uiLength,4); intiBufSize=1024*5; intiSize=iBufSize; LPBYTEpBuf=newBYTE[iBufSize]; intiNumByte; UINTuiTotal=0; while(uiTotal<uiLength) { if((int)(uiLength-uiTotal)<iBufSize) { iSize=uiLength-uiTotal; } intiCount=0; while(iCount<iSize) { iNumByte=servSock.Receive(pBuf,iSize-iCount); iCount+=iNumByte; recvFile.Write(pBuf,iNumByte); } uiTotal+=iCount; } recvFile.Close(); servSock.Close(); charext[10]; CStringtmpExt; _splitpath(recvPathName,NULL,NULL,NULL,ext); tmpExt=ext; if(".bmp"==tmpExt||".pcx"==tmpExt||".tiff"==tmpExt||".gif"==tmpExt||".jpg"==tmpExt||".jpeg"==tmpExt||".tga"==tmpExt||".exif"==tmpExt||".fpx"==tmpExt) { ShellExecute(NULL,"open",recvPathName,NULL,NULL,SW_SHOWNORMAL); } } } return0;}發(fā)送文獻按鈕:voidCmyFileTransferDlg::OnBnClickedBtnSend(){ CFileDialogopenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "全部文獻(*.*)|*.*||"); if(IDOK==openDlg.DoModal()) { CStringopenFileName; openFileName=openDlg.GetFileName(); CSocketsendSock; sendSock.Create(); CStringIPstr; this->GetDlgItem(IDC_IPADDRESS1)->GetWindowText(IPstr); if(sendSock.Connect(IPstr,5000)==0) { return; } CFilesendFile; sendFile.Open(openDlg.GetPathName(),CFile::modeRead); sendSock.Send(openFileName,500); UINTuiLength; uiLength=sendFile.GetLength(); sendSock.Send(&uiLength,4); intiBufSize=1024*5; intiSize=iBufSize; LPBYTEpBuf=newBYTE[iBufSize]; intiNumByte; UINTuiTotal=0; while(uiTotal<uiLength) { if((int)(uiLength-uiTotal)<iBufSize) { iSize=uiLength-uiTotal; } iSize=sendFile.Read(pBuf,iSize); intiCount=0; while(iCount<iSize) { iNumByte=sendSock.Send(pBuf,iSize-iCount); iCount+=iNumByte; if(iCount<iSize) { sendFile.Seek(iSize-iCount,CFile::current); } } uiTotal+=iCount; } sendFile.Close(); sendSock.Close(); }運行成果闡明:為了便于測試和觀察,選擇127.0.0.1的發(fā)送IP地址進行單機測試。圖3程序運行啟動界面雙擊打開myFileTransfer.exe可執(zhí)行程序后的程序啟動界面如圖3所示,然后在“對方IP地址”欄中輸入本地回送地址127.0.0.1準備進行發(fā)送文獻。圖4發(fā)送文獻選擇界面單擊“發(fā)送文獻”按鈕后,彈出如圖4所示的文獻選擇界面,選擇要發(fā)送的文獻并單擊“打開”按鍵,擬定選擇并將所選文獻發(fā)送給接受方。圖5接受方接受到文獻當接受方接受到發(fā)送方傳來的文獻時,接受方程序彈出如圖5所示的“保存”界面,提示顧客接受文獻成功并進行保存。圖6接受圖片自動顯示當接受方接受的文獻為圖片時,程序調(diào)用操作系統(tǒng)默認的圖片瀏覽器自動打開瀏覽接受到的圖片。當接受的是非圖片文獻時,程序則只是保存該文獻,而不自動打開。實驗感想通過獨立完畢了這次實驗的全部內(nèi)容,我對網(wǎng)絡編程有了更全方面、深刻地認識和理解,特別是對Windowssocket的掌握和編程應用。由于我對MFC較為熟悉,因此在整個實驗過程中,我采用MFC進行編程來實現(xiàn)這個傳輸文獻的程序。在程序?qū)崿F(xiàn)之前,我通過網(wǎng)絡上的基于socket網(wǎng)絡編程資料和老師課上解說的內(nèi)容,認真全方面地學習了Windowssocket的運行機制和其在網(wǎng)絡編程上的應用辦法。在設計實現(xiàn)階段,我最先使用的是基礎(chǔ)SOCKET類,但在通信雙方傳送文獻的基本信息的具體實現(xiàn)時,碰到了不少的麻煩。例如SOCKET類中的send辦法的第二個參數(shù)類型是“constchar*”用來指明一種寄存將要發(fā)送數(shù)據(jù)的緩沖區(qū),但在傳文獻信息長度int類型等非char*的變量時轉(zhuǎn)化很麻煩。于是,我查看MSDN文檔理解到MFC已為開發(fā)者封裝了一種很簡便的CSOCKET類。應用CSOCKET類能很方便容易地解決上面的問題,并且實現(xiàn)網(wǎng)絡通信的流程也很清晰,最后我采用MFC封裝的CSOCKET類編碼實現(xiàn)的這次實驗內(nèi)容。在接受圖片自動顯示的問題上,我實驗了兩種實現(xiàn)方式:用一種MFC中的承托圖片控件來顯示和調(diào)用操作系統(tǒng)

溫馨提示

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

評論

0/150

提交評論