• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用VB實現網頁下載跟蹤程序

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 28次 | 進入軟件測試論壇討論

    領測軟件測試網 陶國強  

    互聯網傳輸控件(ITC)是一個很不錯的控件,我們可以利用它非常方便地檢索Web資源,但不幸的是,該控件并沒有提供跟蹤數據傳輸過程的方法。如果ITC控件具有諸如DownloadProgress或者DataArrival這樣的事件,而且該事件還具有相應的參數就好了,但可惜也沒有。那么有沒有方法來獲取網頁下載過程的信息呢?答案是肯定的,下面就來討論一下如何獲取HTTP數據傳輸的過程信息。
    通常,我們使用ITC控件提供的兩種方法來下載Web頁面,即OpenURL和Execute,其中,OpenURL方法最簡單,但其功能有限,用這種方法并不能得到任何過程信息。為了用OpenURL方法獲取Web頁面內容,我們可以使用下面的代碼:
    strPageContent = Inet1.OpenURL(strURL, icString)
    可見,用OpenURL方法下載頁面確實很簡單,但我們不能對到達的數據進行控制,所以,我們需要訪問Winsock緩沖區,該緩沖區的功能是存儲到達的數據。如果我們能夠訪問緩沖區內的數據,那么我們就能在傳輸過程中的任何時刻計算出已到達數據的大小。而利用ITC控件的Execute方法,情況就完全不同了,下面我們來看一下該方法是如何工作的:
    'Execute方法只是向Web服務器發送HTTP請求,而本身并不接收任何數據
    Inet1.Execute strURL, "GET"
    為了檢索已達到數據,我們需要使用GetChunk方法將緩沖區數據讀到VB變量中。
    strBuffer = Inet1.GetChunk(512)
    strArrivedData = strArrivedData & strBuffer
    可見,GetChnuk方法具有Size參數,允許我們自定義從緩沖區內讀出數據塊的大小。因此,我們找到了控制到達數據的方法,而且我們可以在下載過程中實現對已到達數據的控制。在StateChanged事件中加入如下代碼:
    Private Sub Inet1_StateChanged(ByVal State As Integer)
    Select Case State
    Case icResponseCompleted
    Do
    DoEvents
    strBuffer = Inet1.GetChunk(512)
    strArrivedData = strArrivedData & strBuffer
    lngArrivedDataSize = Len(strArrivedData)
    Loop Until Len(strBuffer) = 0
    End Select
    End Sub
    OK!現在我們就能夠顯示已到達數據的大小了。但是如何獲得下載數量的百分比值,然后通過進度條來顯示下載過程呢?首先,我們需要在任何數據到達之前知道頁面文件的大小。根據HTTP規范,Web服務器需要發送內容長度報頭(Content-Length header field)作為HTTP請求的響應,通過這個值我們就可以知道頁面文件的大小。我們可以在StateChanged事件中調用ITC控件的GetHeader方法來獲取這個值,如下所示:
    'This module level variable stores size of the file we are downloading from the web
    Private m_lngDocSize As Long
    Private Sub Inet1_StateChanged(ByVal State As Integer)
    Select Case State
    Case icResponseReceived
    If m_lDocSize = 0 Then
    If Len(Inet1.GetHeader("Content-Length")) > 0 Then
    m_lDocSize = CLng(Inet1.GetHeader("Content-Length"))
    End If
    End If
    End Select
    End Sub
    然而,在某些情況下,Web服務器并不發送內容長度報頭,我們也就不能知道頁面文件大小,也就不能顯示進度信息了。
    現在,我們來創建一個簡單的應用程序來實現我們的目標。
    創建工程
    啟動VB集成開發環境,創建一個標準Windows應用工程,將該工程命名為DownloadProgress,在Project菜單中打開Componets對話框(或按快捷鍵Ctrl+T激活),然后選中下列控件:
    &#8226; Microsoft Internet Transfer Control  
    &#8226; Microsoft Rich Textbox Control  
    &#8226; Microsoft Windows Common Controls  
    選擇保存目錄,然后保存該工程。
    創建圖形用戶界面
    在窗體上放置下列控件:
    &#8226; TextBox  
    &#8226; CommandButton  
    &#8226; 兩個Frame控件
    &#8226; Label
    &#8226; ProgressBar  
    &#8226; RichTextBox  
    &#8226; Internet Transfer Control  
    如下圖所示,在窗體上對以上控件進行布置。


    編寫應用程序代碼
    打開窗體的代碼編輯器,在全局變量聲明部分(General-Declarations)部分進行如下變量聲明。
    Private m_lngDocSize As Long
    這個變量將用來存儲我們將要下載的頁面大小。
    下面,我們將對命令按鈕進行編碼,在Command1_Click 事件中加入如下代碼:
    Private Sub Command1_Click()
    '文件大小值復位
    m_lngDocSize = 0
    '清空rtbDocument的文本
    rtbDocument.Text = ""
    '復位進度條控件
    ProgressBar1.Value = 0.001
    '顯示進度的標簽內容設為空
    lblProgressInfo.Caption = ""
    '定義ITC控件使用的協議為HTTP協議
    Inet1.Protocol = icHTTP
    '調用Execute方法向Web服務器發送HTTP請求
    If Len(txtURL.Text) > 0 Then
    Inet1.Execute Trim$(txtURL.Text), "GET"
    End If
    End Sub
    在命令按鈕中,我們對各個控件的初值進行了復位,并向Web服務器發送了HTTP請求,該URL地址由用戶鍵入到文本框中。在服務器開始響應時,我們需要處理ITC控件的StateChanged事件,從而獲得內容長度報頭,并獲取隨后傳送過來的頁面過程信息。
    Private Sub Inet1_StateChanged(ByVal State As Integer)
    Dim strText As String
    Dim strBuffer As String
    Dim sngProgerssValue As Single
    On Error Resume Next
    Select Case State
    Case icResponseCompleted
    Do '從緩沖區讀取數據
    DoEvents
    strBuffer = Inet1.GetChunk(512)
    strText = strText & strBuffer
    If m_lngDocSize > 0 Then
    If Len(strBuffer) > 0 Then
    '獲得進度百分比值
    sngProgerssValue = Int((Len(strText) / m_lngDocSize) * 100)
    End If
    '更新進度標簽顯示內容
    lblProgressInfo.Caption = "Downloaded " & CStr(Len(strText)) & _
    " bytes (" & CStr(sngProgerssValue) & "%)"
    '用新值更新進度條控件
    ProgressBar1.Value = sngProgerssValue
    End If
    Loop Until Len(strBuffer) = 0
    '將讀取的HTML頁面內容置入RichTextBox控件
    rtbDocument.Text = strText
    Case icResponseReceived
    If m_lngDocSize = 0 Then
    '讀取頁面文件大小
    If Len(Inet1.GetHeader("Content-Length")) > 0 Then
    m_lngDocSize = CLng(Inet1.GetHeader("Content-Length"))
    End If
    End If
    End Select
    End Sub
    一切OK!按F5測試這個新完成的應用程序,在文本框內鍵入任意存在的URL地址,然后點擊讀取按鈕,呵呵,成功了。ㄈ绻⻊掌靼l送了內容長度報頭,我們就能看到結果,如果不發送,這個程序可就罷工了。)
    下載源文件  http://www.ccw.com.cn/htm/app/down/020329.zip

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>