中南大學(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頁珍藏版)》請(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ā)展, 人們的生活越來越離不開網(wǎng)絡(luò), 如今網(wǎng)絡(luò)編程已成為計(jì)算機(jī)
2、發(fā)展的熱點(diǎn), 而在眾多的網(wǎng)絡(luò)通信中, 又以 TCP/IP 協(xié)議最為流行。本文討論的 Winsock 控件,提供了訪問 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ī)范的簡稱,是目前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。所謂 Socket ,通常也稱作 " 套接字 " ,用于描述 IP 地址和端口,是一個(gè)通信鏈的句柄。 應(yīng)用程序通常通過 “套接字” 向網(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)求,利用它可以較為方便的編寫網(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ù)的讀寫操作。 如果兩個(gè)應(yīng)用程序需要通信, 它們可以通過使用 Socket 類來建立套接字連接, 可以將這個(gè)過程想象為一次電話呼叫過程: 呼叫者通過撥 號(hào)與被呼叫者連接, 當(dāng)電話接通時(shí), 雙方都可以自由通話了, 只不過這里的呼叫 者被稱為“客戶”,被呼叫者則稱為“服務(wù)器” ,而號(hào)碼則為“ IP 地址 +端口”, 但在建立連接之前,必須由“客戶”發(fā)出呼叫,且此時(shí)的“服務(wù)器” 正在監(jiān)聽。因此,基
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)聽端口( LocalPort 屬性),端口應(yīng)與客戶端的端口相同,同時(shí)調(diào)用 Listen 方法時(shí)刻監(jiān)聽客戶端的連接請(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)過程 3.3.1 開發(fā)環(huán)境 操作系統(tǒng): Windows 7 旗艦版 開發(fā)語言: 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ā)送文件長度 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; //開始傳輸
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、對(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ù)器端偵聽,客戶端與服務(wù)器端連接成功,圖 5 客戶端選取文件,圖 6 客戶端發(fā)送文件, 圖 7 服務(wù)器端接受保存文件, 圖 8 客戶端文件發(fā)送完畢, 斷開連接,圖 9 服務(wù)器端接收成功, 圖 10 客戶端斷開與服務(wù)器端連接, 圖 11 服務(wù)器端停止偵聽。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專升本計(jì)算機(jī)基礎(chǔ)真題-2
- 中學(xué)班長競選演講稿
- 某公司工作保證書
- 教育強(qiáng)國建設(shè)規(guī)劃綱要(2024—2035年)要點(diǎn)解讀(教育是強(qiáng)國建設(shè)民族復(fù)興之基)
- 小學(xué)英語量詞用法詳解
- 四篇:2024年度民主生活會(huì)召開情況總結(jié)報(bào)告匯編
- 閥門主體材料
- 蝸桿傳動(dòng)的效率、潤滑和熱平衡計(jì)算
- XX地區(qū)水利部門述職報(bào)告工作挑戰(zhàn)與應(yīng)對(duì)
- 初中語文散文閱讀基礎(chǔ)知識(shí)點(diǎn)+經(jīng)典例題解析
- 專升本英語:常考動(dòng)詞搭配
- 21-01《中國近代文學(xué)史》自學(xué)考試題及答案
- 某公司元旦主題教育活動(dòng)方案模板
- 廉潔過春節(jié)清風(fēng)迎新村緊繃紀(jì)律弦廉潔過春節(jié)把好廉潔關(guān)過個(gè)廉潔年
- 小學(xué)英語實(shí)用口語100句