中南大學計算機網絡課程設計 文件傳輸程序_第1頁
中南大學計算機網絡課程設計 文件傳輸程序_第2頁
中南大學計算機網絡課程設計 文件傳輸程序_第3頁
中南大學計算機網絡課程設計 文件傳輸程序_第4頁
中南大學計算機網絡課程設計 文件傳輸程序_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第三章 文件傳輸程序3.1設計要求包括客戶端和服務器程序,應實現以下功能: (1) 客戶端既能上傳文件到服務器,也能從服務器下載文件; (2) 在客戶端上可顯示文件基本信息和傳輸狀態信息,可瀏覽服務器上供下載的文件列表,選擇某文件下載到本地某目錄下; (3) 服務器端能接收客戶端上傳的文件,并保存在某一目錄下;也能響應客戶端的文件瀏覽與下載請求; (4)增加其它附加創新功能。程序應具有圖形化界面,美觀友好。3.2設計思想 隨著計算機網絡的迅速發展,人們的生活越來越離不開網絡,如今網絡編程已成為計算機發展的熱點,而在眾多的網絡通信中,又以TCP/IP協議最為流行。本文討論的Winsock控件,提

2、供了訪問TCP/IP網絡的捷徑,使用它可以不必了解TCP/IP的細節和調用Winsock API,只要設置好相應的屬性和觸發事件后的處理,就可以實現計算機之間的數據通信。一、Winsock控件 Winsock即Windows Sockets規范的簡稱,是目前最流行的網絡通信應用程序接口之一。所謂Socket,通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過“套接字”向網絡發出請求或者應答網絡請求。Socket是網絡上運行的兩個程序間雙向通訊的一端,它既可以接受請求,也可以發送請求,利用它可以較為方便的編寫網絡上數據的傳遞。Winsock控件

3、工作在傳輸層上,在這一層上,目前主要流行的協議包括TCP和UDP兩種:TCP協議適用于那些對于數據的可靠性要求比較高的情況,目前大多數的網絡應用層協議都是基于TCP協議的(例如常用的HTTP、FTP、SMTP、POP3等協議);UDP協議適用于對數據可靠性要求不高而對速度要求較高的情況,這里主要包括一些需要大流量的(例如Real公司的RTSP協議,騰訊公司的QQ協議等)。二、Winsock控件通信的工作原理 Winsock控件是基于Socket規范創建的,所以其通信的實質是對Socket接口進行數據的讀寫操作。如果兩個應用程序需要通信,它們可以通過使用Socket類來建立套接字連接,可以將這個

4、過程想象為一次電話呼叫過程:呼叫者通過撥號與被呼叫者連接,當電話接通時,雙方都可以自由通話了,只不過這里的呼叫者被稱為“客戶”,被呼叫者則稱為“服務器”,而號碼則為“IP地址+端口”,但在建立連接之前,必須由“客戶”發出呼叫,且此時的“服務器” 正在監聽。因此,基于TCP/IP協議的通信,需要分別建立客戶端應用程序和服務器端應用程序。其大致流程如圖1所示: 圖1 Winsock工作原理 端口號被規定在065535范圍內的某一個整數,其中01023被預先定義的服務器通信所占用(如telnet占用23,http占用端口80),所以最好使用102465535這些端口中的某一個,以免發生端口沖突。三、

5、基本方法 客戶端要與服務器端進行通信,首先,必須知道服務器端的域名或IP地址(RemoteHost屬性),就像要和某人打電話前,必須知道對方的電話號碼;其次,還必須和服務器端約定相同的端口(RemotePort屬性),用于數據的輸入和輸出;最后,調用Connect方法與服務器端建立連接。 服務器端應設置一個監聽端口(LocalPort屬性),端口應與客戶端的端口相同,同時調用Listen方法時刻監聽客戶端的連接請求(ConnectionRequest事件);當接收到客戶端的連接請求時,可調用ConnectionRequest事件的Accept方法,這樣與客戶端的連接就建立了。 客戶端和服務器端

6、成功建立連接后,任何一方都可以自由的發送數據(SendData方法)和接收數據(GetData方法),這些方法都在DataArrival事件中。3.3編程實現過程 3.3.1 開發環境 操作系統:Windows 7旗艦版開發語言:C+ / MFC編譯環境:MS Visual C+6.0 3.3.2 程序界面設計此程序根據功能需求,分別設計了客戶端(圖3-3-2-1)和服務器端(圖3-3-2-2),實例如下:圖3-3-2-1圖3-3-2-2 3.3.3 關鍵模塊分析1. 文件選取void CTCPClientDlg:OnSelect() int i;CFile MyFile;CString st

7、rlen;CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files (*.*)|*.*|",NULL);if(FileDlg.DoModal() = IDOK)m_FilePath = FileDlg.GetPathName();GetDlgItem(IDC_FLIENAME)->SetWindowText(m_FilePath);i = m_FilePath.ReverseFind('');m_Fi

8、leName = m_FilePath.Mid(i + 1);/m_FileName = FileDlg.GetFileTitle();MyFile.Open(m_FilePath,CFile:modeRead);m_FileLen = MyFile.GetLength();strlen.Format("%u bytes",m_FileLen);GetDlgItem(IDC_STATIC_LEN)->SetWindowText(strlen);MyFile.Close();/MyFile.Open(m_FilePath,CFile:modeRead);/UpdateD

9、ata(FALSE);2. 文件發送UINT SendTread(LPVOID lpParam) int iRxNum=0,iTxNum=0;/每次接受,發送,讀取文件的字符數UINT iTotal = 0;/已發送文件長度CFile MyFile;CString TempName,str;CTCPClientDlg* m_pDlg=(CTCPClientDlg*)lpParam;CProgressCtrl* m_ProgressCtrl1=&(m_pDlg->m_ProgressCtrl);ClientSocket* pSocket = m_pDlg->m_pMySock

10、et; memset(sendbuf1,0,M);/發送文件大小以及名字sendbuf10=m_FileLen/1000000000+48; sendbuf11=m_FileLen%1000000000/100000000+48;sendbuf12=m_FileLen%100000000/10000000+48;sendbuf13=m_FileLen%10000000/1000000+48;sendbuf14=m_FileLen%1000000/100000+48;sendbuf15=m_FileLen%100000/10000+48;sendbuf16=m_FileLen%10000/100

11、0+48;sendbuf17=m_FileLen%1000/100+48;sendbuf18=m_FileLen%100/10+48;sendbuf19=m_FileLen%10+48; a=strlen(m_FilePath);sendbuf110=a/1000+48; sendbuf111=a%1000/100+48;sendbuf112=a%100/10+48;sendbuf113=a%10+48;if(N-10-4-a)>=m_FileLen) times=1; else times=1+(m_FileLen-(N-10-4-a)/N+1;/表示最少兩次,第一次和最后一次 /進度

12、條初始化m_ProgressCtrl1->SetRange(0,times-1) ;m_ProgressCtrl1->SetPos(0) ; m_ProgressCtrl1->SetStep(1); strcat(sendbuf1,(char*)m_FilePath.GetBuffer(m_FileLen); pSocket->Send(sendbuf1,10+4+a,0); /m_ProgressCtrl;/開始傳輸文件數據str.Format("開始傳送文件.");m_pDlg->UpdateMGData(str);MyFile.Open(

13、m_FilePath,CFile:modeRead);if(times=1) memset(rx_buf,0,4); memset(SendBuff,0,sizeof(SendBuff); MyFile.Read(SendBuff,m_FileLen); iTxNum = pSocket->Send(SendBuff,m_FileLen,0); pSocket->Receive(rx_buf,4,0); while(rx_buf0!='K') pSocket->Receive(rx_buf,4,0); m_ProgressCtrl1->StepIt();

14、 MyFile.Close(); str.Format("文件傳送完畢,斷開連接!"); m_pDlg->UpdateMGData(str);else memset(SendBuff,0,sizeof(SendBuff); full_times=times-2; Times=times; Times=Times-1; MyFile.Read(SendBuff,N-10-4-a); iTxNum = pSocket->Send(SendBuff,N-10-4-a,0); while(Times-) if(Times=0) memset(rx_buf,0,4);me

15、mset(SendBuff,0,sizeof(SendBuff);MyFile.Read(SendBuff,m_FileLen-(N-10-4-a)-N*full_times); pSocket->Receive(rx_buf,4,0);/如果收到K,則完成 while(rx_buf0!='K')pSocket->Receive(rx_buf,4,0);iTxNum = pSocket->Send(SendBuff,m_FileLen-(N-10-4-a)-N*full_times,0);m_ProgressCtrl1->StepIt(); str.Fo

16、rmat("文件傳送完畢,斷開連接!"); m_pDlg->UpdateMGData(str); break; if(Times>0) memset(rx_buf,0,4); memset(SendBuff,0,sizeof(SendBuff); MyFile.Read(SendBuff,N); pSocket->Receive(rx_buf,4,0);/如果收到K,則完成 while(rx_buf0!='K') pSocket->Receive(rx_buf,4,0); iTxNum = pSocket->Send(SendBuff,N,0); m_ProgressCtrl1->StepIt(); /對應whilere

溫馨提示

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

評論

0/150

提交評論