天天看點

VB Inet控件(又叫Internet Transfer 控件)的詳細用法

添加 c:/windows/system32/msinet.ocx

Inet控件也叫Internet Transfer 控件,這個控件封裝了http協定以及ftp協定,使用起來非常友善。是以大家經常使用。然而大家通常使用的隻是其部分功能,接下來我們講一下它的全部詳細功能,看過之後你也許會有眼前一亮的感覺。會猛然覺得我們之前懂得的隻是皮毛。

閑話少說,下面開講:

Internet Transfer 控件實作了兩種廣泛使用的 Internet 協定:超文本傳送協定(HyperText Transfer Protocol)(也就是HTTP) 和檔案傳送協定(File Transfer Protocol) (即FTP)。使用 Internet Transfer 控件可以通過 OpenURL 或 Execute 方法連接配接到任何使用這兩個協定的站點并檢索檔案。

可以做到的大體方向

在應用程式中添加 FTP 浏覽器。

建立自動從公共 FTP 站點下載下傳檔案的應用程式。

分析 World Wide Web 站點中的圖形引用,并隻下載下傳圖形。

提供以自定義格式顯示從 Web 頁獲得的動态資料。 

基本操作 

Internet Transfer 控件的功能依賴于将要使用的協定。由于所支援的兩種協定工作起來不盡相同,所能夠進行的操作就依賴于正在使用的協定。例如,GetHeader 方法隻能用于 HTTP(HTML 文檔)協定。

然而,有些過程對兩個協定是通用的。最基本的,如果要使用任何一個協定,則必須:

将 AccessType 屬性設定為合法的代理伺服器。

用合法的 URL 調用 OpenURL 方法。

用合法的 URL 和協定支援的指令調用 Execute 方法。

用 GetChunk 方法從緩沖區擷取資料。 

設定 AccessType 屬性:使用代理伺服器 

為了與 Internet 建立任何形式的連接配接,必須确定計算機如何連接配接到 Internet 上。如果在 intranet 上,可能需要提供代理伺服器才能連接配接到 Internet 上。

簡單地說,代理伺服器是計算機和 Internet 之間的媒介。intranet 上所有需要連接配接到 Internet 上的計算機,都必須通過代理伺服器。代理行使 intranet 和 Internet 之間的防火牆功能,能夠阻止非法的最終使用者和外部請求,也就保護了 intranet 不受破壞。

要查找計算機中的代理設定值,請按照以下步驟執行: 

打開控制台的Internet選項。

在“Internet選項”對話框中,單擊“連接配接”。

在“代理伺服器”中,确認選中了“通過代理伺服器連接配接”複選框。

如果選中了,則單擊“設定”。在該對話框中可以找到能夠用于多種協定的代理伺服器的名稱。如果沒有定義代理伺服器,請與系統管理者聯系,以獲得可用的代理伺服器。 

如果希望使用對話框中未列出的代理伺服器,可将 AccessType 屬性設定為 icNamedProxy (2)。然後将 Proxy 屬性設定為代理伺服器的名稱,如下面的代碼所示:

Inet1.Proxy = "myProxyName" 

Inet1.AccessType = icNamedProxy

另一方面,如果希望使用預設代理伺服器(由計算機的系統資料庫決定),則可以忽略 Proxy 屬性,而隻需将 AccessType 設定為 icUseDefault (0)。

AccessType 的設定值在下表中列出:

常數 值 描述 

icUseDefault 0 (預設)用作預設。控件使用系統資料庫中的預設設定通路 Internet。 

icDirect 1 直接連接配接 Internet。該控件可直接連接配接到 Internet。 

icNamedProxy 2 命名的代理伺服器。訓示該控件使用 Proxy 屬性确定的代理伺服器。

調用 OpenURL 方法 

'名為“Text1”的 TextBox 控件儲存了 

'該方法的結果。Internet 傳輸 

'控件的名稱是“Inet1”。 

作為結果,TextBox 控件儲存了 HTML 源碼,它看上去應和下圖顯示的相似:

在這種情況下,預設操作傳回的是 URL 定位的 HTML 文檔。然而,如果 URL 被改為指向文本檔案,則将獲得實際的檔案。例如,下面的代碼:

Text1.Text = Inet1. _ 

将獲得檔案的實際文本,如下所示:

提示 在使用 OpenURL 或 Execute 方法時,不需要設定 Protocol 屬性。Internet Transfer 控件會自動按 URL 的協定部分确定的協定來設定。

最後,可以用包含附加資料的 URL 調用 OpenURL 方法。例如,很多 Web 站點提供了搜尋資料庫的能力。要搜尋資料庫,則需要在發送的 URL 中包含搜尋條件。例如下面的代碼用條件“find=Maui”調用名為“search.exe”的搜尋引擎。

Dim strURL As String 

strURL = "http://www.baidu.com/s?wd=ibiancheng"

Text1.Text = Inet1.OpenURL(strURL)

如果搜尋引擎找到了符合條件的内容,将合成一個 HTML 文檔并攜帶适當的資訊傳回。

用 OpenURL 方法儲存到檔案 

如果需要将通過 OpenURL 方法擷取的資料儲存到檔案,可以使用 Open、Put 和 Close 語句,如下面的代碼所示。該示例先将獲得的二進制檔案傳入 Byte 數組,然後将該資料儲存到磁盤中:

Dim bData() As Byte '資料變量 

Dim intFile As Integer '可用檔案變量 

strURL = _ 

intFile = FreeFile() '将 intFile 設定為未使用的檔案 

' OpenURL 方法的結果首先傳入 Byte 數組, 

'然後将 Byte 數組儲存到磁盤。 

bData() = Inet1.OpenURL(strURL, icByteArray) 

Open "C:\Temp\Softlib.e xe" For Binary Access Write _ 

As #intFile 

Put #intFile, , bData() 

Close #intFile

可用類似的過程将文本檔案寫入磁盤中,不同的隻是不再需要 Byte 數組了,資料可以直接儲存到檔案中:

Dim strURL As String 'URL 字元串 

IntFile = FreeFile() 

Open "c:\temp\MSsource.txt" For Output _ 

As #IntFile 

Write #IntFile, Inet1.OpenURL(strURL) 

Close #IntFile

同步和異步傳輸 

OpenURL 方法以同步方式傳輸資料。在這裡,同步指的是傳輸操作未完成之前,不能執行其它過程。這樣資料傳輸就必須在執行其它代碼之前完成。

而 Execute 方法以異步方式傳輸資料。在調用 Execute 方法時,傳輸操作與其它過程無關。這樣,在調用 Execute 方法後,在背景接收資料的同時,即可同時執行其它代碼。

對 Internet Transfer 控件的使用者來說這意味着什麼?簡單地說,用 OpenURL 方法能夠直接得到可儲存到磁盤的資料流(如上所述),或者直接在 TextBox 控件中閱覽(如果資料是文本格式的)。從另一方面說,如果用 Execute 方法擷取資料,則必須用 StateChanged 事件監視該控件的連接配接狀态。當達到适當的狀态時,調用 GetChunk 方法從控件的緩沖區擷取資料。下面更詳細地讨論這一操作。

在 FPT 協定中使用 Execute 方法 

Execute 方法具有四個參數:url、operation、data 和 requestHeaders。FTP 操作隻用到了 operation 參數和 url 參數,其中後者是可選的。例如,要從遠端計算機中得到一個檔案,可用下面的代碼:

"GET disclaimer.txt C:\Temp\Disclaimer.txt"

如果正在用 FTP 從匿名 FTP 伺服器中擷取檔案,就應熟悉在伺服器目錄樹中漫遊的特定指令,以及将其中檔案擷取到本地的硬碟中的指令。例如,要用 FPT 協定改變目錄,應使用帶有希望改變到的目錄路徑的“CD”指令。

對絕大多數通用操作,如将檔案傳入伺服器,以及從伺服器擷取檔案,Internet 傳輸控件在 Execute 方法中使用了(與 FTP)相同或相近的指令。例如,下面的代碼将“CD”指令作為 Execute 方法的參數以改變路徑:

'txtURL 文本框包含了要打開的路徑。 

'txtRemotePath 文本框包含了要改變到的路徑。 

Inet1.Execute txtURL.Text, "CD " & txtRemotePath.Text

注意 在 Execute 方法中使用 FTP 指令時,沒有用到 data 和 requestHeaders 參數。所有的操作和它們的參數都在 operation 參數中作為字元串進行傳遞;參數之間用空格進行分隔。在下面的描述中,不要把“file1”和“file2”項與 data 和 requestHeaders 參數搞混。

FTP 操作的文法是:

operationName file1 file2

例如,要擷取檔案,在下面的代碼中包含了操作的名稱 (“擷取”),以及該操作所需的兩個檔案名:

'得到名為“Disclaimer.txt”的檔案,并将其複制到 

' C:\Temp\Disclaimer.txt。 

Inet1.Execute, _ 

"GET Disclaimer.txt C:\Temp\Disclaimer.txt"

下表列出了該控件支援的 FTP 指令:

操作 描述 示例 

CD file1 改變目錄。改變到由 file1 指定的目錄中。 Execute , "CD docs\mydocs"

CDUP 改變到父目錄。功能與“CD ..”相同。 Execute , "CDUP"

DELETE file1 删除由 file1 指定的檔案。 Execute , "DELETE discard.txt"

DIR [file1] 在由 file1 指定的目錄中查找。如果沒有指定 file1 目錄,則查找目前工作目錄。使用 GetChunk 方法傳回資料。 Execute , "DIR /mydocs"

GET file1 file2 擷取由 file1 指定的遠端檔案,并建立由 file2 指定的新的本地檔案。 Execute , _ 

"GET getme.txt C:\gotme.txt"

MKDIR file1 建立由 file1 指定的目錄。是否能夠成功地執行,取決于使用者在遠端主機上的權限。 Execute , "MKDIR /myDir"

PUT file1 file2 将由 file1 指定的本地檔案,複制到由 file2 指定的遠端主機檔案中。 Execute , _ 

"PUT C:\putme.txt /putme.txt"

PWD 列印工作目錄。傳回目前目錄的名稱。用 GetChunk 方法傳回資料。 Execute , "PWD"

QUIT 結束目前連接配接。 Execute , "QUIT"

RECV file1 file2 與 GET 相同。 Execute , _ 

"RECV getme.txt C:\gotme.txt"

RENAME file1 file2 檔案重命名。是否能夠成功地執行,取決于使用者在遠端主機上的權限。 Execute , 

"RENAME old.txt new.txt"

RMDIR file1 删除目錄。是否能夠成功地執行,取決于使用者在遠端主機上的權限。 Execute , "RMDIR oldDir"

SEND file1 将檔案複制到 FTP 站點。(與 PUT 相同) Execute , _ 

"SEND C:\putme.txt /putme.txt"

SIZE file1 傳回由 file1 指定檔案的大小。 Execute "SIZE /largefile.txt"

重點 如果代理伺服器是 CERN 代理伺服器,就不允許使用直接的 FTP 連接配接(使用 Execute 方法)。在這種情況下,要獲得檔案,則需使用帶 Open、Put 和 Close 語句的 OpenURL 方法,就象前面“用 OpenURL 方法儲存到檔案”提到的那樣。還可以用 OpenURL 方法得到目錄清單,即将目标目錄作為 URL,并調用該方法。

在 HTTP 協定上使用 Execute 方法 

HTTP 協定允許客戶機用 GET、HEAD、POST 和 PUT 指令向伺服器請求資料。下表中列出了這些操作:

"/Index.html", "GET"

HEAD 隻擷取 URL 屬性中命名的檔案的檔案标頭。 Execute , "HEAD"

POST 方法提供附加資料(學過網頁制作的或學過http協定的應該知道),以支援向遠端主機的請求。 Execute , "POST", strFormData

PUT 替換指定的 URL 中的資料。 Execute , "PUT", "replace.htm"

通用網關接口和 Execute 方法 

很多 World Wide Web 站點提供了搜尋資料庫的能力。它是通過 HTTP 協定用通用網關接口 (CGI) 發送查詢的能力完成的。

在這裡不再讨論 CGI 了。然而,如果對 CGI 比較了解,就可用 Execute 方法構造一個應用程式模拟 World Wide Web 站點的行為。例如,下面的代碼給出了典型的 CGI 查詢字元串:

<a href="http://www.baidu.com/s?wd=ibiancheng">http://www.baidu.com/s?wd=ibiancheng</a>

如下所示,用 Execute 方法也可以發送同樣的查詢:

Dim strURL As String, strFormData As String 

strFormData = "wd=ibiancheng" 

Inet1.E xecute strURL, "POST", strFormData

如果希望得到從伺服器發回的結果(如上面的示例所示),就必須使用控件的 GetChunk 方法以擷取作為結果的 HTML 文檔。

在 State 事件中使用 GetChunk 方法 

在從遠端計算機下載下傳資料時,将建立異步連接配接。例如,在 Execute 方法中使用“擷取”操作,将使伺服器擷取請求的檔案。當擷取了整個檔案之後,State 參數将傳回 icResponseCompleted (12)。在這時候,就可以用 GetChunk 方法從緩沖區中擷取資料了。下面的示例中給出了這種情況:

Private Sub Inet1_StateChanged(ByVal State As Integer) 

Dim vtData As Variant '資料變量。 

Select Case State 

'...沒有給出其它情況。 

Case icResponseCompleted '12 

'打開檔案用于寫入。 

Open txtOperation For Binary Access _ 

Write As #intFile

'得到第一個大塊。注意:指定 Byte 數組 

' (icByteArray) 以擷取二進制檔案。 

vtData = Inet1.GetChunk(1024, icString)

Do While LenB(vtData) &gt; 0 

Put #intFile, , vtData 

'得到下一大塊。 

vtData = Inet1.GetChunk(1024, icString) 

Loop 

Close #intFile 

End Select 

End Sub

登入到 FTP 伺服器 

FTP 伺服器有兩種:公用的和私用的。公用伺服器,顧名思義,是對所有人開放的。而私用伺服器,除了該伺服器的真正使用者,其他人不能登入。在這兩種情況下,FTP 協定都要求提供使用者名和密碼。這兩個參數用來驗明使用者,并允許(或禁止)進一步的操作。

要登入到公用伺服器,通常的做法是以“匿名”登入 (UserName = "anonymous"),然後發送使用者的電子郵件名稱作為密碼。然而使用 Internet 傳輸控件這一過程還能夠進一步簡化。按照預設規定,如果沒有提供 UserName 和 Password 屬性值,該控件發送“匿名”作為 UserName,使用者的電子郵件名稱作為 Password。

如果要登入到私用伺服器,隻需适當地設定 UserName、Password 和 URL 屬性,并調用 Execute 方法,如下面的示例所示:

With Inet1 

.UserName = "John Smith" 

.Password = "mAuI&amp;9$6" 

.Execute ,"DIR" '傳回該目錄。 

.Execute ,"CLOSE" '關閉連接配接。 

End With

在調用 Execute 方法之後,FTP連接配接仍舊打開着。這時可以繼續使用 Execute 方法完成其它 FTP 操作,比如 CD 和 GET。如果會話已經完成,使用 Execute 方法執行 CLOSE 操作以關閉連接配接。也可以通過改變 URL 屬性,并調用 OpenURL 或 Execute 方法,自動關閉該連接配接,這樣的操作會關閉目前 FTP 連接配接,并打開新的 URL或IP。

結束