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

