程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用WinInet開發Internet客戶端應用指南(一)

用WinInet開發Internet客戶端應用指南(一)

編輯:關於VC++

一、概述

一個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客戶端應用程序的具體步驟和細節。(待續)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved