zoukankan      html  css  js  c++  java
  • VB INET控件的全部用法

    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 不受破坏。

    要查找计算机中的代理设置值,请按照以下步骤执行:

    注意 下面的步骤只能用于 Windows 95 和 Windows NT(R) 4.0 系统。

    在计算机的“任务栏”中,单击“启动”。


    在“设置”项中,单击“控制面板”。


    双击“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 方法
    设置完 AccessType 属性后,最基本的操作就是用合法的 URL 调用 OpenURL 方法。使用 OpenURL 方法时,操作所得到的结果将依赖于目标 URL。例如下面的 URL 将返回在
    www.microsoft.com 中找到的 HTML 文档:

    '名为“Text1”的 TextBox 控件保存了
    '该方法的结果。Internet 传输
    '控件的名称是“Inet1”。
    Text1.Text = Inet1.OpenURL("
    http://www.microsoft.com")

    作为结果,TextBox 控件保存了 HTML 源码,它看上去应和下图显示的相似:



    在这种情况下,缺省操作返回的是 URL 定位的 HTML 文档。然而,如果 URL 被改为指向文本文件,则将获得实际的文件。例如,下面的代码:

    Text1.Text = Inet1. _
    OpenURL("ftp://ftp.microsoft.com/disclaimer.txt")

    将获得文件的实际文本,如下所示:



    提示 在使用 OpenURL 或 Execute 方法时,不需要设置 Protocol 属性。Internet Transfer 控件会自动按 URL 的协议部分确定的协议来设置。

    最后,可以用包含附加数据的 URL 调用 OpenURL 方法。例如,很多 Web 站点提供了搜索数据库的能力。要搜索数据库,则需要在发送的 URL 中包含搜索条件。例如下面的代码用条件“find=Maui”调用名为“search.exe”的搜索引擎。

    Dim strURL As String
    strURL = _
    "
    http://www.howzit.com/cgi-bin/search.e xe?find=maui
    Text1.Text = Inet1.OpenURL(strURL)

    如果搜索引擎找到了符合条件的内容,将合成一个 HTML 文档并携带适当的信息返回。

    用 OpenURL 方法保存到文件
    如果需要将通过 OpenURL 方法获取的数据保存到文件,可以使用 Open、Put 和 Close 语句,如下面的代码所示。该示例先将获得的二进制文件传入 Byte 数组,然后将该数据保存到磁盘中:

    Dim strURL As String
    Dim bData() As Byte '数据变量
    Dim intFile As Integer '可用文件变量
    strURL = _
    "ftp://ftp.microsoft.com/Softlib/Softlib.e xe"
    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 字符串
    Dim intFile As Integer '可用文件变量
    IntFile = FreeFile()
    strURL = "
    http://www.microsoft.com"
    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 参数,其中后者是可选的。例如,要从远程计算机中得到一个文件,可用下面的代码:

    Inet1.Execute "FTP://ftp.microsoft.com", _
    "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 命令向服务器请求数据。下表中列出了这些操作:

    操作 描述 示例
    GET 获取 url 中命名的文件。 Execute "
    http://www.microsoft.com" & _
    "/default.htm", "GET"


    HEAD 只获取 URL 属性中命名的文件的文件标头。 Execute , "HEAD"

    POST 提供附加数据,以支持向远程主机的请求。 Execute , "POST", strFormData

    PUT 替换指定的 URL 中的数据。 Execute , "PUT", "replace.htm"



    通用网关接口和 Execute 方法
    很多 World Wide Web 站点提供了搜索数据库的能力。它是通过 HTTP 协议用通用网关接口 (CGI) 发送查询的能力完成的。

    在这里不再讨论 CGI 了。然而,如果对 CGI 比较了解,就可用 Execute 方法构造一个应用程序模拟 World Wide Web 站点的行为。例如,下面的代码给出了典型的 CGI 查询字符串:

    http://www.yippee.com/cgi-bin/find.e xe?find=Hangzhou

    如下所示,用 Execute 方法也可以发送同样的查询:

    Dim strURL As String, strFormData As String
    strURL = "//
    www.yippee.com/cgi-bin/find.e xe"
    strFormData = "find=Hangzhou"
    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) > 0
    Put #intFile, , vtData
    '得到下一大块。
    vtData = Inet1.GetChunk(1024, icString)
    Loop
    Put #intFile, , vtData
    Close #intFile
    End Select
    End Sub

    登录到 FTP 服务器
    FTP 服务器有两种:公用的和私用的。公用服务器,顾名思义,是对所有人开放的。而私用服务器,除了该服务器的真正用户,其他人不能登录。在这两种情况下,FTP 协议都要求提供用户名和密码。这两个参数用来验明用户,并允许(或禁止)进一步的操作。

    要登录到公用服务器,通常的做法是以“匿名”登录 (UserName = "anonymous"),然后发送用户的电子邮件名称作为密码。然而使用 Internet 传输控件这一过程还能够进一步简化。按照缺省规定,如果没有提供 UserName 和 Password 属性值,该控件发送“匿名”作为 UserName,用户的电子邮件名称作为 Password。

    如果要登录到私用服务器,只需适当地设置 UserName、Password 和 URL 属性,并调用 Execute 方法,如下面的示例所示:

    With Inet1
    .URL = "ftp://ftp.someFTPSite.com"
    .UserName = "John Smith"
    .Password = "mAuI&9$6"
    .Execute ,"DIR" '返回该目录。
    .Execute ,"CLOSE" '关闭连接。
    End With

    在调用 Execute 方法之后,FTP 连接仍旧打开着。这时可以继续使用 Execute 方法完成其它 FTP 操作,比如 CD 和 GET。如果会话已经完成,使用 Execute 方法执行 CLOSE 操作以关闭连接。也可以通过改变 URL 属性,并调用 OpenURL 或 Execute 方法,自动关闭该连接,这样的操作会关闭当前 FTP 连接,并打开新的 URL

    对于FTP,你可以使用Execute方法执行FTP命令SIZE获得文件大小。然后在StateChanged事件中可以获得返回的文件大小。
    Private Sub Command1_Click()
    Inet1.Execute "ftp://127.0.0.1", "SIZE 1.gif"
    End Sub

    Private Sub Inet1_StateChanged(ByVal State As Integer)
    'State = 12 时,用 GetChunk 方法检索服务器的响应。

    Dim vtData As Variant ' Data variable.
    Select Case State
    '...没有列举其它情况。
    Case icError '11
    '出现错误时,返回 ResponseCode 和 ResponseInfo。
    vtData = Inet1.ResponseCode & ":" & _
    Inet1.ResponseInfo
    Case icResponseCompleted ' 12


    Dim strData As String
    Dim bDone As Boolean: bDone = False

    '取得第一个块。
    vtData = Inet1.GetChunk(1024, icString)
    DoEvents

    Do While Not bDone
    strData = strData & vtData
    '取得下一个块。
    vtData = Inet1.GetChunk(1024, icString)
    DoEvents

    If Len(vtData) = 0 Then
    bDone = True
    End If
    Loop
    MsgBox strData
    End Select

    End Sub

    对于HTTP下载,你可以用GetHeader(Content-length)来获得文件大小。但不是所有HTTP下载时都能获得文件长度,特别是通过代理服务器下载文件时。如:
    Private Sub Form_Load()
    Inet1.Execute "http://askpro.yeah.net/"
    End Sub

    Private Sub Inet1_StateChanged(ByVal State As Integer)
    If State = icResponseReceived Then
    MsgBox "File size is " & Inet1.GetHeader("Content-Length")
    End If
    End Sub

    ==============================================

    在VB中实现文件上传
    VisualBasic作为一个集应用程序开发、测试、查错功能于一体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端操作系统,Informix作为服务器数据库。
    问题的出现
    在开发该维护系统的过程中,注意到Informix数据库的字段类型CLOB填入数据时需要函数FILETOCLOB("FILENAME","SERVER"),其中的"FILENAME"需要指出文件路径和文件名称。然而,在维护过程中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端。
    解决办法
    1.FTP传输工具
    我们首先使用FTP传输工具,用VB5.0中SHELL命令调用DOS批处理文件来实现传输的需要。
    Shell调用格式:
    Shell(pathname[,windowstyle])
    例子:Shell("c:\windows\upload.bat")
    批处理文件upload.bat的内容:
    c:\windows\ftphostname
    username
    password
    sendc:\zrh\upload.txtupload.txt
    bye
    该命令实现了文件"upload.txt"的传输要求。在使用完毕之后,再调用命令把该文件删除。
    例子:Shell("c:\windows\del_up.bat")
    批处理文件del_up.bat的内容:
    c:\windows\ftphostname
    username
    password
    deleupload.txt
    bye
    这样,文件"upload.txt"被删除。
    但是,另一个问题出现了。由于Shell函数的运行机制是与其它程序同步执行,也就是说,当调用Shell函数的子程序还没有执行完毕之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中,就会出现某个记录的文件还没有传到,而下一个插入语句(Insert)已经开始调用。这样,ODBC调用就会出现错误。
    2.INET控件
    InternetTransfer控件提供了Internet上最常使用的两种协议:HTTP和FTP。使用HTTP协议可以连接到WWW服务器上来下载文件;使用FTP协议则可以登录到FTP服务器。一般的FTP命令,例如CD、GET都可以通过Execute方法实现。
    下面是一个设置INET控件属性的例子。
    inet1.URL=ftp://username:password@hostname/document
    inet1.Protocol=2-icFTP
    inet1.RemoteHost=hostname
    inet1.RemotePort=21
    inet1.Username=username
    inet1.Password=password
    执行文件传输:
    Inet1.Execute"ftp://username:password@hostname",_
    "PUT"&local_filename&"UPLOAD1.TXT"
    right1=Inet1.StillExecuting
    DoWhileright1
    right1=Inet1.StillExecuting
    DoEvents
    Loop
    这样便实现了文件的上载。
    *SINET控件的优点
    INET控件与Shell()函数的不同之处在于INET控件通过调用语句
    right1=Inet1.StillExecuting
    DoWhileright1
    right1=Inet1.StillExecuting
    DoEvents
    Loop来控制语句执行的顺序。在文件传输工作未完成之前,程序不会执行其它语句,自然也就不会出现调用Shell函数所出现的问题。变量right1用来测试inet1的执行状态,如果进程中仍在进行文件传输的工作,则调用过程DoEvents给系统空闲时间来做文件传输工作,这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除。
    Inet1.Execute"ftp://informix:informix@rd",_
    "DELETEUPLOAD1.TXT"
    right1=Inet1.StillExecuting
    DoWhileright1
    right1=Inet1.StillExecuting
    DoEvents
    Loop
    将上载的文件删除是为了避免占用服务器端磁盘空间。
    *S利用StateChanged事件提示信息
    服务器在执行inet1.execute的同时也激活了Inet1_StateChanged事件,进程可以根据捕获到的状态进行动作。
    object_StateChanged(ByValStateAsInteger)
    State:整数类型Integer
    下面是状态的说明。
    常数值 描述icNone
    0 未报告状态icHostResolvingHost
    1 控件正在寻找指定主机的IP地址icHostResolved
    2 控件已成功找到指定主机的IP地址icConnecting
    3 控件正在与指定主机进行连接icConnected
    4 控件已成功与指定主机连接icRequesting
    5 控件正在向主机发出请求icRequestSent
    6 控件已成功向主机发出请求icReceivingResponse
    7 控件正在从主机接收反馈信息icResponseReceived
    8 控件已成功从主机接受反馈信息icDisconnecting
    9 控件正在与主机断开icDisconnected
    10 控件已与主机断开icError
    11 在与主机通信的过程中发生了错误icResponseCompleted
    12 请求结束且数据已经接收到
    下面是一个例子。
    PrivateSubInet1_StateChanged(ByValStateAsInteger)
    'RetrieveserverresponseusingtheGetChunk
    'methodwhenState=12.Thisexampleassumesthe
    'dataistext.
    SelectCaseState
    '...Othercasesnotshown.
    CaseicResponseReceived'12
    DimvtDataAsVariant'Datavariable.
    DimstrDataAsString:strData=""
    DimbDoneAsBoolean:bDone=False
    'Getfirstchunk.
    vtData=Inet1.GetChunk(1024,icString)
    DoWhileNotbDone
    strData=Data&vtData
    'Getnextchunk.
    vtData=Inet1.GetChunk(1024,icString)
    IfLen(vtData)=0Then
    bDone=True
    EndIf
    Loop
    txtData.Text=strData
    EndSelect
    EndSub

    ==========================================
    方法2,设置信息:
    Inet1.Protocol = icFTP
    Inet1.RemoteHost = ServerName'服务器地址
    Inet1.RemotePort = 21'FTP端口
    Inet1.UserName = uName'用户名
    Inet1.Password = uPWS'密码

    下载文件:
    Inet1.Execute "", "GET 1.txt d:\1.txt"
    ri = Inet1.StillExecuting
    Do While ri
    ri = Inet1.StillExecuting
    DoEvents
    Loop
    上传文件:
    Inet1.Execute "", "PUT d:\1.txt 1.txt"
    ri = Inet1.StillExecuting
    Do While ri
    ri = Inet1.StillExecuting
    DoEvents
    Loop

     

     
  • 相关阅读:
    NSInvocation 回调使用
    C#控制台源程序分享
    HTML 表单控件的汇总
    学习笔记(2):HTML 常用标签的归纳
    学习笔记(4):C#中的正则简单总结
    学习笔记(5):DIV+CSS 经典盒子模型 积累
    学习笔记(3):sql语句的总结
    毕业一年小结
    头文件方法问题
    百度被黑事件
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668509.html
Copyright © 2011-2022 走看看