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

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
