中南大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)文件傳輸程序綜述
《中南大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)文件傳輸程序綜述》由會(huì)員分享,可在線閱讀,更多相關(guān)《中南大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)文件傳輸程序綜述(14頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 第三章 文件傳輸程序 3.1 設(shè)計(jì)要求 包括客戶端和服務(wù)器程序,應(yīng)實(shí)現(xiàn)以下功能: ( 1)客戶端既能上傳文件到服務(wù)器,也能從服務(wù)器下載文件; ( 2)在客戶端上可顯示文件基本信息和傳輸狀態(tài)信息,可瀏覽服務(wù)器上供下載的文件列表,選擇某文件下載到本地某目錄下; ( 3)服務(wù)器端能接收客戶端上傳的文件,并保存在某一目錄下;也能響應(yīng)客戶端的文件瀏覽與下載請(qǐng)求; ( 4)增加其它附加創(chuàng)新功能。程序應(yīng)具有圖形化界面,美觀友好。 3.2 設(shè)計(jì)思想 隨著計(jì)算機(jī)網(wǎng)絡(luò)的迅速發(fā)展, 人們的生活越來(lái)越離不開(kāi)網(wǎng)絡(luò), 如今網(wǎng)絡(luò)編程已成為計(jì)算機(jī)
2、發(fā)展的熱點(diǎn), 而在眾多的網(wǎng)絡(luò)通信中, 又以 TCP/IP 協(xié)議最為流行。本文討論的 Winsock 控件,提供了訪問(wèn) TCP/IP 網(wǎng)絡(luò)的捷徑,使用它可以不必了 解 TCP/IP 的細(xì)節(jié)和調(diào)用 Winsock API ,只要設(shè)置好相應(yīng)的屬性和觸發(fā)事件后的 處理,就可以實(shí)現(xiàn)計(jì)算機(jī)之間的數(shù)據(jù)通信。一、 Winsock 控件 Winsock 即 Windows Sockets 規(guī)范的簡(jiǎn)稱,是目前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。所謂 Socket ,通常也稱作 " 套接字 " ,用于描述 IP 地址和端口,是一個(gè)通信鏈的句柄。 應(yīng)用程序通常通過(guò) “套接字” 向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答
3、網(wǎng)絡(luò)請(qǐng)求。 Socket 是網(wǎng)絡(luò)上運(yùn)行的兩個(gè)程序間雙向通訊的一端,它既可以接受請(qǐng)求, 也可以發(fā)送請(qǐng)求,利用它可以較為方便的編寫(xiě)網(wǎng)絡(luò)上數(shù)據(jù)的傳遞。 Winsock 控件 工作在傳輸層上,在這一層上,目前主要流行的協(xié)議包括 TCP和 UDP兩種: TCP 協(xié)議適用于那些對(duì)于數(shù)據(jù)的可靠性要求比較高的情況, 目前大多數(shù)的網(wǎng)絡(luò)應(yīng)用層 協(xié)議都是基于 TCP協(xié)議的(例如常用的 HTTP、FTP、 SMTP、 POP3等協(xié)議); UDP 協(xié)議適用于對(duì)數(shù)據(jù)可靠性要求不高而對(duì)速度要求較高的情況, 這里主要包括一些 需要大流量的(例如 Real 公司的 RTSP協(xié)議,騰訊公司的
4、QQ協(xié)議等)。 二、 Winsock 控件通信的工作原理 Winsock 控件是基于 Socket 規(guī)范創(chuàng)建的,所以其通信的實(shí)質(zhì)是對(duì) Socket 接 口進(jìn)行數(shù)據(jù)的讀寫(xiě)操作。 如果兩個(gè)應(yīng)用程序需要通信, 它們可以通過(guò)使用 Socket 類來(lái)建立套接字連接, 可以將這個(gè)過(guò)程想象為一次電話呼叫過(guò)程: 呼叫者通過(guò)撥 號(hào)與被呼叫者連接, 當(dāng)電話接通時(shí), 雙方都可以自由通話了, 只不過(guò)這里的呼叫 者被稱為“客戶”,被呼叫者則稱為“服務(wù)器” ,而號(hào)碼則為“ IP 地址 +端口”, 但在建立連接之前,必須由“客戶”發(fā)出呼叫,且此時(shí)的“服務(wù)器” 正在監(jiān)聽(tīng)。因此,基
5、于 TCP/IP 協(xié)議的通信,需要分別建立客戶端應(yīng)用程序和服務(wù)器端應(yīng)用 程序。其大致流程如圖 1 所示: 圖 1 Winsock 工作原理 端口號(hào)被規(guī)定在 0~65535 范圍內(nèi)的某一個(gè)整數(shù), 其中 0~1023 被預(yù)先定義的服務(wù)器通信所占用(如 telnet 占用 23, http 占用端口 80),所以最好使用1024~65535這些端口中的某一個(gè),以免發(fā)生端口沖突。 三、基本方法 客戶端要與服務(wù)器端進(jìn)行通信,首先,必須知道服
6、務(wù)器端的域名或 IP 地址 ( RemoteHost屬性),就像要和某人打電話前, 必須知道對(duì)方的電話號(hào)碼; 其次,還必須和服務(wù)器端約定相同的端口 (RemotePort 屬性),用于數(shù)據(jù)的輸入和輸出;最后,調(diào)用 Connect 方法與服務(wù)器端建立連接。 服務(wù)器端應(yīng)設(shè)置一個(gè)監(jiān)聽(tīng)端口( LocalPort 屬性),端口應(yīng)與客戶端的端口相同,同時(shí)調(diào)用 Listen 方法時(shí)刻監(jiān)聽(tīng)客戶端的連接請(qǐng)求( ConnectionRequest 事 件);當(dāng)接收到客戶端的連接請(qǐng)求時(shí),可調(diào)用 ConnectionRequest 事件的 Accept 方法,這樣與客戶端的連接就建立了。 客
7、戶端和服務(wù)器端成功建立連接后,任何一方都可以自由的發(fā)送數(shù)據(jù) ( SendData 方法)和接收數(shù)據(jù)( GetData 方法),這些方法都在 DataArrival 事 件中。 3.3 編程實(shí)現(xiàn)過(guò)程 3.3.1 開(kāi)發(fā)環(huán)境 操作系統(tǒng): Windows 7 旗艦版 開(kāi)發(fā)語(yǔ)言: C++ / MFC 編譯環(huán)境: MS Visual C++6.0 3.3.2 程序界面設(shè)計(jì) 此程序根據(jù)功能需求,分別設(shè)計(jì)了客戶端(圖 3-3-2-1 )和服務(wù)器端(圖 3-3-2-2 ), 實(shí)例如下:
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ā)送文件長(zhǎng)度 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;// 表示最少兩次,第一次和最后一次 //進(jìn)度條初始化 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; //開(kāi)始傳輸
16、文件數(shù)據(jù) str.Format(" 開(kāi)始傳送文件 ..."); 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(" 文件傳送完畢 ,斷開(kāi)連接 !"); 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(" 文件傳送完畢 ,斷開(kāi)連接 !"); 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、對(duì)應(yīng) 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 分別為客戶端和服務(wù)器端初始狀態(tài),圖 3 客戶端連接服務(wù)器端, 圖 4 服務(wù)器端偵聽(tīng),客戶端與服務(wù)器端連接成功,圖 5 客戶端選取文件,圖 6 客戶端發(fā)送文件, 圖 7 服務(wù)器端接受保存文件, 圖 8 客戶端文件發(fā)送完畢, 斷開(kāi)連接,圖 9 服務(wù)器端接收成功, 圖 10 客戶端斷開(kāi)與服務(wù)器端連接, 圖 11 服務(wù)器端停止偵聽(tīng)。
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語(yǔ)法-形容詞和副詞
- 《公民的基本權(quán)利和義務(wù)》人教部編版道德與法治課件
- 五年級(jí)上冊(cè)音樂(lè)課件-豐收的節(jié)日(2)|人音版(簡(jiǎn)譜)最新
- 企業(yè)家商業(yè)計(jì)劃培訓(xùn)教程75275
- 員工保密意識(shí)及技能教育培訓(xùn)課件
- [精選]CAINA肖爾布拉克營(yíng)銷戰(zhàn)略規(guī)劃(PPT 174頁(yè))5799
- 教育專題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專題:兒童防拐教案1
- 數(shù)據(jù)隔離級(jí)別
- 最新2018清新簡(jiǎn)約工作匯報(bào)模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷售培訓(xùn)77824
- (連云港專版)中考?xì)v史復(fù)習(xí) 第2單元 中國(guó)近代史 第9課時(shí) 抗日戰(zhàn)爭(zhēng)和人民解放戰(zhàn)爭(zhēng)的勝利課件 北師大版