一、概述
一個(gè) Internet 客戶端程序的目的是通過 Internet 協(xié)議如: HTTP 、 FTP 等來存取網(wǎng)絡(luò)數(shù)據(jù)源(服務(wù)器)的信息??蛻舳顺绦蚩梢栽L問服務(wù)器獲得象天氣預(yù)報(bào),股票價(jià)格、重要新聞數(shù)據(jù),甚至是與服務(wù)器交換信息。 Internet 客戶端程序可以通過外部網(wǎng)絡(luò)( Internet )或內(nèi)部網(wǎng)絡(luò)(一般為 Intranet )訪問服務(wù)器。
為了開發(fā) Internet 客戶端程序。 MFC 類庫提供了專門的 Win32 Internet 擴(kuò)展接口,也就是 WinInet 。 MFC 將 WinInet 封裝在一個(gè)標(biāo)準(zhǔn)的、易于使用的類集合中。在編寫 WinInet 客戶端程序時(shí) , 你既可以直接調(diào)用 Win32 函數(shù),也可以使用 WinInet 類庫。
Win32 Internet 擴(kuò)展提供了對(duì)普通 Internet 協(xié)議的訪問,這些協(xié)議包括: HTTP 、 FTP 和 Gopher 。 Gopher 已經(jīng)漸漸淡出。借助于 WinInet 編程接口,開發(fā)人員不必去了解 Winsock 、 TCP/IP 和特定 Internet 協(xié)議的細(xì)節(jié)就可以編寫出高水平的 Internet 客戶端程序。 WinInet 為所有幾種協(xié)議( HTTP 、 FTP 和 Gopher )提供了統(tǒng)一的函數(shù)集,也就是 Win32 API 接口。利用這些統(tǒng)一的函數(shù)集,大大簡(jiǎn)化了針對(duì) HTTP 、 FTP 等協(xié)議的編程,從而輕松地將 Internet 集成到自己的應(yīng)用程序中。底層協(xié)議的轉(zhuǎn)換(如從 FTP 到 HTTP )只要對(duì)源代碼稍作修改就可以完成。
在 Visual C++ 工程中提供有兩種方式來使用 WinInet 。一種是直接調(diào)用 Win32 Internet 函數(shù),另一種是使用 WinInet 類庫。
MFC 對(duì) WinInet 的封裝是通過提供三個(gè)由 CStdioFile 派生類實(shí)現(xiàn)的。這三個(gè)派生類是: CInternetFile 、 CHttpFile 和 CGopherFile 。由于 Gopher 協(xié)議已經(jīng)很少使用,所以本文將不再對(duì) CGopherFile 進(jìn)行討論。對(duì)開發(fā)人員來說,不管你以前是否用過 CStdioFile , WinInet 都是很好理解并且易于使用的。它使得存取 Internet 數(shù)據(jù)易如反掌,使得 Internet 數(shù)據(jù)和本地?cái)?shù)據(jù)的處理一致透明,數(shù)據(jù)的存儲(chǔ)位置已經(jīng)不再重要。
MFC WinInet 類有如下優(yōu)點(diǎn):
- 緩沖器輸入輸出
- 數(shù)據(jù)的類型安全處理
- 許多函數(shù)的參數(shù)都是缺省值
- 對(duì)普通的 Internet 錯(cuò)誤進(jìn)行異常處理
- 自動(dòng)清除打開的句柄和連接
使用 WinInet 提供的 API 函數(shù) , 你可以:
- 通過 HTTP 協(xié)議下載 HTML 頁, HTTP 協(xié)議是專門用于在服務(wù)器和客戶瀏覽器之間傳輸 HTML 頁。
- 發(fā)送 FTP 請(qǐng)求上傳或下載文件以及獲取服務(wù)器的目錄信息。通過匿名登陸下載文件便是 FTP 的典型應(yīng)用。
- 其它基于 HTTP 、 FTP 協(xié)議的應(yīng)用。
使用 WinInet 的一般流程為:
圖一
下表描述了一個(gè) Internet 客戶端程序?qū)崿F(xiàn)的一般步驟:
(表一)
|
實(shí)現(xiàn) |
方法 |
|
建立一個(gè)連接 |
創(chuàng)建 CInternetSession 對(duì)象,它是 WinInet Internet 客戶應(yīng)用的前提條件 |
|
打開一個(gè) URL |
建立一個(gè)連接,調(diào)用 CInternetSession::OpenURL 函數(shù),返回一個(gè)只讀資源對(duì)象 |
|
讀取 URL 數(shù)據(jù) |
打開一個(gè) URL ,調(diào)用 CInternetSession::QueryOption |
|
查詢 Internet 選項(xiàng)設(shè)置 |
建立一個(gè)連接,調(diào)用 CInternetFile::Read |
|
設(shè)置一個(gè) Internet 選項(xiàng) |
建立一個(gè)連接,調(diào)用 CInternetSession::SetOption |
|
設(shè)置一個(gè)用狀態(tài)信息調(diào)用的函數(shù) |
建立一個(gè)連接,調(diào)用 CInternetSession::EnableStatusCallback 重寫 CInternetSession::OnStatusCallback 函數(shù) |
|
關(guān)閉連接 |
用 CInternetSession 對(duì)象方法,清除打開的連接 |
為了創(chuàng)建 Internet 客戶端程序, MFC 提供了如下的 C++ 類和全程函數(shù):
C++ 類
CInternetSession
(父類
CObject
)
CInternetConnection (父類 CObject)
CFtpConnection
CGopherConnection
CHttpConnection
CInternetFile(父類 CStdioFile)
CGopherFile
CHttpFile
CFileFind(父類 CObject)
CFtpFileFind
CGopherFileFind
CGopherLocator(父類 CObject)
CInternetException(父類 CException)
全程函數(shù) :
AfxParseURL
AfxGetInternetHandleType
AfxThrowInternetException
這些類和全程函數(shù)除 CFileFind 在 AFX.H 里聲明之外,其余都在 AFXINET.H 文件里聲明。它們對(duì) HTTP 、 FTP 和 Gopher 等協(xié)議進(jìn)行了高度抽象,形成了一套高級(jí) API 函數(shù)。 利用這些 API 可以快速直接地開發(fā) Internet 應(yīng)用。例如,連接到 FTP 服務(wù)器一般需要幾個(gè)步驟,而且需要做一些底層處理。但使用上述的 MFC 類提供的 API ,只需要對(duì) CInternetSession::GetFTPConnection 進(jìn)行一次調(diào)用,便可以輕松建立連接。
大家知道,每一個(gè) Internet 應(yīng)用其數(shù)據(jù)交換都是建立在 Internet 會(huì)話( Session )的基礎(chǔ)之上的, MFC 是通過 CInternetSession 類對(duì)象來實(shí)現(xiàn) Internet 會(huì)話的。用這個(gè)類不僅可以創(chuàng)建會(huì)話,而且可以創(chuàng)建幾個(gè)并發(fā)的 Internet 會(huì)話。
為了與服務(wù)器進(jìn)行通訊,除了要?jiǎng)?chuàng)建 CInternetSession 對(duì)象之外,還必須創(chuàng)建 CInternetConnection 對(duì)象 , 針對(duì)不同的協(xié)議, CInternetConnection 對(duì)象有三種類型:
- CInternetSession::GetFtpConnection
- CInternetSession::GetHttpConnection
- CInternetSession::GetGopherConnection
這些函數(shù)調(diào)用并不會(huì)讀寫服務(wù)器上的文件。如果你想要讀寫數(shù)據(jù),必須要打開文件才能操作。其處理流程應(yīng)該是這樣的:
- 首先創(chuàng)建 CInternetSession 對(duì)象實(shí)例
- 如果創(chuàng)建的 Session 要讀寫文件,則必須創(chuàng)建 CInternetFile 對(duì)象實(shí)例(或者是它的子類 CHttpFile 、 CGopherFile 對(duì)象實(shí)例)。其實(shí),讀取數(shù)據(jù)最容易的方式是調(diào)用 CInternetSession::OpenURL 函數(shù)。 這個(gè)函數(shù)解析你提供的統(tǒng)一資源定位符( URL ),然后打開與 URL 指定的服務(wù)器連接,同時(shí)返回一個(gè)只讀的 CInternetFile 對(duì)象。 CInternetSession::OpenURL 不針對(duì)特定的協(xié)議類型 —— 不管是 FTP 還是 HTTP 都可以調(diào)用,它甚至可以處理本地文件,此時(shí)返回的是 CStdioFile ,而不是 CInternetFile 。
- 如果創(chuàng)建的 Session 不讀寫文件,而是要實(shí)現(xiàn)其它的任務(wù),如刪除某個(gè) FTP 目錄下的文件等,則你不需要?jiǎng)?chuàng)建 CInternetFile 實(shí)例。
創(chuàng)建 CInternetFile 對(duì)象的方法有兩種:
- 如果用 CInternetSession::OpenURL 建立與服務(wù)器的連接,調(diào)用返回 CStdioFile 。
- 如果用 CInternetSession::GetFtpConnection 、 GetGopherConnection 或者 CHttpConnection::OpenRequest 建立與服務(wù)器的連接,你必須調(diào)用相應(yīng)的 CFtpConnection::OpenFile 、 CGopherConnection::OpenFile 或者 CHttpConnection::OpenRequest ,返回的內(nèi)容也與 CInternetFile 、 CGopherFile 或者 CHttpFile 對(duì)應(yīng)。
綜上所述,實(shí)現(xiàn) Internet 客戶端應(yīng)用的步驟因協(xié)議而異。要看你是創(chuàng)建基于 OpenURL 的一般 Internet 客戶端應(yīng)用,還是使用 GetXXXConnection 函數(shù)之一針對(duì)特定協(xié)議的 Internet 客戶端應(yīng)用。
在后繼文章中我們將進(jìn)一步討論用 WinInet 實(shí)現(xiàn) Internet 客戶端應(yīng)用程序的具體步驟和細(xì)節(jié)。(待續(xù))
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

