中南大學計算機網(wǎng)絡課程設計文件傳輸程序綜述
《中南大學計算機網(wǎng)絡課程設計文件傳輸程序綜述》由會員分享,可在線閱讀,更多相關(guān)《中南大學計算機網(wǎng)絡課程設計文件傳輸程序綜述(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 第三章 文件傳輸程序 3.1 設計要求 包括客戶端和服務器程序,應實現(xiàn)以下功能: ( 1)客戶端既能上傳文件到服務器,也能從服務器下載文件; ( 2)在客戶端上可顯示文件基本信息和傳輸狀態(tài)信息,可瀏覽服務器上供下載的文件列表,選擇某文件下載到本地某目錄下; ( 3)服務器端能接收客戶端上傳的文件,并保存在某一目錄下;也能響應客戶端的文件瀏覽與下載請求; ( 4)增加其它附加創(chuàng)新功能。程序應具有圖形化界面,美觀友好。 3.2 設計思想 隨著計算機網(wǎng)絡的迅速發(fā)展, 人們的生活越來越離不開網(wǎng)絡, 如今網(wǎng)絡編程已成為計算機
2、發(fā)展的熱點, 而在眾多的網(wǎng)絡通信中, 又以 TCP/IP 協(xié)議最為流行。本文討論的 Winsock 控件,提供了訪問 TCP/IP 網(wǎng)絡的捷徑,使用它可以不必了 解 TCP/IP 的細節(jié)和調(diào)用 Winsock API ,只要設置好相應的屬性和觸發(fā)事件后的 處理,就可以實現(xiàn)計算機之間的數(shù)據(jù)通信。一、 Winsock 控件 Winsock 即 Windows Sockets 規(guī)范的簡稱,是目前最流行的網(wǎng)絡通信應用程序接口之一。所謂 Socket ,通常也稱作 " 套接字 " ,用于描述 IP 地址和端口,是一個通信鏈的句柄。 應用程序通常通過 “套接字” 向網(wǎng)絡發(fā)出請求或者應答
3、網(wǎng)絡請求。 Socket 是網(wǎng)絡上運行的兩個程序間雙向通訊的一端,它既可以接受請求, 也可以發(fā)送請求,利用它可以較為方便的編寫網(wǎng)絡上數(shù)據(jù)的傳遞。 Winsock 控件 工作在傳輸層上,在這一層上,目前主要流行的協(xié)議包括 TCP和 UDP兩種: TCP 協(xié)議適用于那些對于數(shù)據(jù)的可靠性要求比較高的情況, 目前大多數(shù)的網(wǎng)絡應用層 協(xié)議都是基于 TCP協(xié)議的(例如常用的 HTTP、FTP、 SMTP、 POP3等協(xié)議); UDP 協(xié)議適用于對數(shù)據(jù)可靠性要求不高而對速度要求較高的情況, 這里主要包括一些 需要大流量的(例如 Real 公司的 RTSP協(xié)議,騰訊公司的
4、QQ協(xié)議等)。 二、 Winsock 控件通信的工作原理 Winsock 控件是基于 Socket 規(guī)范創(chuàng)建的,所以其通信的實質(zhì)是對 Socket 接 口進行數(shù)據(jù)的讀寫操作。 如果兩個應用程序需要通信, 它們可以通過使用 Socket 類來建立套接字連接, 可以將這個過程想象為一次電話呼叫過程: 呼叫者通過撥 號與被呼叫者連接, 當電話接通時, 雙方都可以自由通話了, 只不過這里的呼叫 者被稱為“客戶”,被呼叫者則稱為“服務器” ,而號碼則為“ IP 地址 +端口”, 但在建立連接之前,必須由“客戶”發(fā)出呼叫,且此時的“服務器” 正在監(jiān)聽。因此,基
5、于 TCP/IP 協(xié)議的通信,需要分別建立客戶端應用程序和服務器端應用 程序。其大致流程如圖 1 所示: 圖 1 Winsock 工作原理 端口號被規(guī)定在 0~65535 范圍內(nèi)的某一個整數(shù), 其中 0~1023 被預先定義的服務器通信所占用(如 telnet 占用 23, http 占用端口 80),所以最好使用1024~65535這些端口中的某一個,以免發(fā)生端口沖突。 三、基本方法 客戶端要與服務器端進行通信,首先,必須知道服
6、務器端的域名或 IP 地址 ( RemoteHost屬性),就像要和某人打電話前, 必須知道對方的電話號碼; 其次,還必須和服務器端約定相同的端口 (RemotePort 屬性),用于數(shù)據(jù)的輸入和輸出;最后,調(diào)用 Connect 方法與服務器端建立連接。 服務器端應設置一個監(jiān)聽端口( LocalPort 屬性),端口應與客戶端的端口相同,同時調(diào)用 Listen 方法時刻監(jiān)聽客戶端的連接請求( ConnectionRequest 事 件);當接收到客戶端的連接請求時,可調(diào)用 ConnectionRequest 事件的 Accept 方法,這樣與客戶端的連接就建立了。 客
7、戶端和服務器端成功建立連接后,任何一方都可以自由的發(fā)送數(shù)據(jù) ( SendData 方法)和接收數(shù)據(jù)( GetData 方法),這些方法都在 DataArrival 事 件中。 3.3 編程實現(xiàn)過程 3.3.1 開發(fā)環(huán)境 操作系統(tǒng): Windows 7 旗艦版 開發(fā)語言: C++ / MFC 編譯環(huán)境: MS Visual C++6.0 3.3.2 程序界面設計 此程序根據(jù)功能需求,分別設計了客戶端(圖 3-3-2-1 )和服務器端(圖 3-3-2-2 ), 實例如下:
8、 圖 3-3-2-1 圖 3-3-2-2 3.3.3 關(guān)鍵模塊分析 1. 文件選取 void CTCPClientDlg::OnSelect() { in
9、t i; CFile MyFile; CString strlen; 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)->S
10、etWindowText(m_FilePath); i = m_FilePath.ReverseFind(\\); m_FileName = 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_STATI
11、C_LEN)->SetWindowText(strlen); MyFile.Close(); } //MyFile.Open(m_FilePath,CFile::modeRead); //UpdateData(FALSE); } 2. 文件發(fā)送 UINT SendTread(LPVOID lpParam) { int iRxNum=0,iTxNum=0; //每次接受,發(fā)送,讀取文件的字符數(shù) UINT iTotal = 0; //已發(fā)送文件長度 CFile MyFile; C
12、String TempName,str; CTCPClientDlg* m_pDlg=(CTCPClientDlg*)lpParam; CProgressCtrl* m_ProgressCtrl1=&(m_pDlg->m_ProgressCtrl); ClientSocket* pSocket = m_pDlg->m_pMySocket; memset(sendbuf1,0,M); //發(fā)送文件大小以及名字 sendbuf1[0]=m_FileLen/1000000000+48; sendbuf1[1]=m_FileLen%10
13、00000000/100000000+48; sendbuf1[2]=m_FileLen%100000000/10000000+48; sendbuf1[3]=m_FileLen%10000000/1000000+48; sendbuf1[4]=m_FileLen%1000000/100000+48; sendbuf1[5]=m_FileLen%100000/10000+48; sendbuf1[6]=m_FileLen%10000/1000+48; sendbuf1[7]=m_FileLen%1000/100+48; sendbu
14、f1[8]=m_FileLen%100/10+48; sendbuf1[9]=m_FileLen%10+48; a=strlen(m_FilePath); sendbuf1[10]=a/1000+48; sendbuf1[11]=a%1000/100+48; sendbuf1[12]=a%100/10+48; sendbuf1[13]=a%10+48; if((N-10-4-a)>=m_FileLen) times=1; else times=1+(m_FileLen-(N-10-4
15、-a))/N+1;// 表示最少兩次,第一次和最后一次 //進度條初始化 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; //開始傳輸
16、文件數(shù)據(jù) str.Format(" 開始傳送文件 ..."); m_pDlg->UpdateMGData(str); MyFile.Open(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->Re
17、ceive(rx_buf,4,0); while(rx_buf[0]!=K) pSocket->Receive(rx_buf,4,0); m_ProgressCtrl1->StepIt(); MyFile.Close(); str.Format(" 文件傳送完畢 ,斷開連接 !"); m_pDlg->UpdateMGData(str); } else { memset(SendBuff,0,sizeof(SendBuff)); full_times=times-2; Times
18、=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); memset(SendBuff,0,sizeof(SendBuff)); MyFile.Read(SendBuff,m_FileLen-(N-10-4-a)-N*full_times); pSocket
19、->Receive(rx_buf,4,0);// 如果收到 K, 則完成 while(rx_buf[0]!=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.Format(" 文件傳送完畢 ,斷開連接 !"); m_pDlg->UpdateMGData(str); break; } if(Times>0)
20、 { memset(rx_buf,0,4); memset(SendBuff,0,sizeof(SendBuff)); MyFile.Read(SendBuff,N); pSocket->Receive(rx_buf,4,0);// 如果收到 K, 則完成 while(rx_buf[0]!=K) pSocket->Receive(rx_buf,4,0); iTxNum = pSocket->Send(SendBuff,N,0); m_ProgressCtrl1->StepIt(); } }//
21、對應 while } return 0; } 3.3.4 結(jié)果演示與分析 圖 3-3-4-1
22、 圖 3-3-4-2 圖 3-3-4-3 圖 3-3-4-4
23、 圖 3-3-4-5 圖 3-3-4-6 圖 3-3-4-7
24、 圖 3-3-4-8 圖 3-3-4-9
25、 圖 3-3-4-10 圖 3-3-4-11 圖 1、圖 2 分別為客戶端和服務器端初始狀態(tài),圖 3 客戶端連接服務器端, 圖 4 服務器端偵聽,客戶端與服務器端連接成功,圖 5 客戶端選取文件,圖 6 客戶端發(fā)送文件, 圖 7 服務器端接受保存文件, 圖 8 客戶端文件發(fā)送完畢, 斷開連接,圖 9 服務器端接收成功, 圖 10 客戶端斷開與服務器端連接, 圖 11 服務器端停止偵聽。
- 溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語法-形容詞和副詞
- 《公民的基本權(quán)利和義務》人教部編版道德與法治課件
- 五年級上冊音樂課件-豐收的節(jié)日(2)|人音版(簡譜)最新
- 企業(yè)家商業(yè)計劃培訓教程75275
- 員工保密意識及技能教育培訓課件
- [精選]CAINA肖爾布拉克營銷戰(zhàn)略規(guī)劃(PPT 174頁)5799
- 教育專題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專題:兒童防拐教案1
- 數(shù)據(jù)隔離級別
- 最新2018清新簡約工作匯報模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷售培訓77824
- (連云港專版)中考歷史復習 第2單元 中國近代史 第9課時 抗日戰(zhàn)爭和人民解放戰(zhàn)爭的勝利課件 北師大版