




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自動焊錫企業ESG實踐與創新戰略研究報告
- 圣誕頭飾企業數字化轉型與智慧升級戰略研究報告
- 學習臺燈企業數字化轉型與智慧升級戰略研究報告
- 兼職推廣人員合同樣本
- 竹纖維餐具企業ESG實踐與創新戰略研究報告
- 加壓及閉合裝置企業ESG實踐與創新戰略研究報告
- 纖維增強塑料冷卻塔企業縣域市場拓展與下沉戰略研究報告
- 健身器械收貨合同樣本
- 電工填料氧化鋁企業數字化轉型與智慧升級戰略研究報告
- 真空熱風干燥設備企業縣域市場拓展與下沉戰略研究報告
- 《蘭亭集序》《歸去來兮辭》對比閱讀課件(教材精研+情境任務)統編版高中語文選擇性必修下冊
- 農貿市場計量管理制度(3篇)
- 拼音bpmfdtnl課件教學課件最新
- 一級建造師《港口與航道工程管理與實務》課件專業工程技術
- 國家開放大學《社會心理學》形考任務1-4參考答案
- 《工程制圖》期末考試試卷附答案
- 重癥患者的容量管理課件
- 二年級下冊道德與法治 課件-9 小水滴的訴說 部編版 (共16張PPT)
- 生產設備點檢記錄表
- 轉化膜與著色技術
- DL∕T 1286-2021 火電廠煙氣脫硝催化劑檢測技術規范
評論
0/150
提交評論