zoukankan      html  css  js  c++  java
  • Visual Basic .Net中实现HTTP协议(一)、(二)、(三)、(四)、(五)【转载】

      (一)

    HTTP是Hypertext Transfer Protocol的简称,即:超文本传输协议。在TCP/IP协议簇中的一百多个协议中,HTTP协议可以说是平常接触最多的一种协议了。因为日常浏览网页时所使用的浏览器浏览,其基本的协议类型就是HTTP协议。HTTP协议是一个客户端/服务器协议,这里所说的服务器端是指提供WWW服务的主机,即各类Web站点等。而客户端是指运行各类浏览器(如IE、Netscape等)或者下载工具的主机。

    HTTP协议从产生到目前,主要经历了三个发展阶段,也就是通常说的三个版本:HTTP 0.9、HTTP 1.0和HTTP 1.1版。HTTP 0.9版也是HTTP原始协议,它最早出现在1990年,由于它只是一个简单的面向消息的协议,所以很快一个新的HTTP协议版本出现了,即:HTTP 1.0版,这个版本在保持了对HTTP 0.9版本的兼容的同时,还增加了在复杂网络情况下,对不同的类型的对象服务能力。HTTP 1.1是在HTTP 1.0基础上发展下来的,它依然保持对HTTP 0.9和HTTP 1.0的兼容。和HTTP 1.0比较,主要改进的是性能、安全和数据处理方面。目前人们又开始提出了HTTP协议的下一个版本了,那就是HTTP-NG(Next Generation of HTTP)。在这个版本中,可以想象的是无论是性能、效率还是安全性都会有一个更大的提高。

      在TCP/IP协议簇中的所有协议,.Net FrameWork SDK中对HTTP协议的支持是最全面的,具体表现在.Net FrameWork SDK为实现HTTP协议提供了许多专门的类。其数量之多,功能之全面是其他协议无可比拟的。Visual Basic .Net通过使用这些类,可以方便的实现各种HTTP协议功能。

      一.HTTP协议会话:

      HTTP协议是一个客户端/服务器协议,它是建立在请求/响应范式的,客户机和服务器完成一个HTTP会话主要通过以下四步:

      1. 建立连接。建立连接是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口(HTTP协议一般使用的是80端口)上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。

      2. 客户端发送请求。 在建立连接后,客户机会往服务器正在侦听的端口发送请求消息,完成提出请求动作。一个完整的请求消息=请求行和请求头,其中请求头包括包括用户可以接受的数据类型、压缩方法、语言、长度、压缩方法、最后一次修改时间、数据有效期等。大多数请求头并不是必需要定义的,但对于POST请求命令来说Content-Length就必须定义。一个请求行的结构如下:

      请求命令 请求URI HTTP版本号

      其中的HTTP协议中的请求命令见表01所示。图01是利用侦听方法获得的客户端IE浏览器向WWW主机发送请求命令。

    Visual Basic .Net中实现HTTP协议(一)
    图01:IE浏览器向WWW主机发送请求行命令

    请求命令 功能
    GET 请求一个WWW页面或者URI资源
    HEAD 要求服务器查找某对象的元信息,而不是对象本身
    PUT 从客户机向服务器传送数据,在要求服务器和CGI做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容,让CGI程序处理
    POST 附加资源
    DELETE 删除操作
    LINK 连接二个存在的资源
    UNLINK 切断二个已有的资源连接


    表01:HTTP协议中客户端的请求命令

      3. 服务器进行响应。服务器在处理完客户的请求之后,要向客户机发送响应消息。其响应消息是由状态行和应答头组成的。其中应答头包括服务程序名,通知客户请求的URI需要认证,请求的资源何时能使用等。状态行的主要结构如下:

      HTTP版本号 状态码 原因叙述

      其中最常见的状态码是“200”和“404”,下面是服务器响应客户端的一个请求通过的状态行:

    HTTP/1.1 200 OK

      下面是服务器响应客户端的一个请求失败的状态行:

    HTTP/1.1 404 Object Not Found

      4. 关闭连接。

      在下面的内容中将使用Visual Basic .Net通过.Net FrameWork SDK提供的类来模拟IE浏览器中发送的请求行命令以及获取WWW主机返回的状态行信息。首先还是先了解一下.Net FrameWork SDK为在Visual Basic .Net实现HTTP协议所提供的类。

    (二)

    二..Net FrameWork SDK中提供的实现HTTP协议的类:

      在.Net FrameWork SDK中实现HTTP协议的类主要位于命名空间“System.Net”。主要的类有十七种,其名称及其功能简介具体如表02所示: 

    作用
    FileWebRequest 提供WebRequest类的文件系统实现。
    FileWebResponse 提供WebResponse类的文件系统实现。
    GlobalProxySelection 包含所有HTTP请求的全局默认代理实例。
    HttpVersion 定义受HttpWebRequest和HttpWebResponse类支持的HTTP 版本号。
    HttpWebRequest 提供WebRequest类的HTTP特定的实现。
    HttpWebResponse 提供WebResponse类的HTTP特定的实现。
    NetworkCredential 为基于密码的身份验证方案提供凭据。
    CredentialCache 为多个凭据提供存储。
    ServicePoint 提供HTTP连接的连接管理。
    WebClient 提供向URI标识的资源发送数据和从URI标识的资源接收数据的公共方法。不能继承此类。
    WebException 通过可插接协议访问网络期间出错时引发的异常。
    WebHeaderCollection 包含与请求或响应关联的协议标头。
    WebPermission 控制访问HTTPInternet资源的权限。
    WebPermissionAttribute 指定权限以访问Internet资源。
    WebProxy 包含WebRequest类的HTTP代理设置。
    WebRequest 发出对统一资源标识符(URI)的请求。
    WebResponse 提供来自统一资源标识符(URI)的响应。
     


    表02:.Net FrameWork SDK中提供的用以实现HTTP协议的类

      由于.Net FrameWork SDK中提供的用以实现HTTP协议的类实在太多,下面就选择一些在实现HTTP协议的客户端程序中经常使用的、以及本文下面内容中所涉及到的的类加以介绍。

      1. WebRequest类:

      WebRequest类是一个基类,它在.Net框架中主要用于访问Internet数据的请求/响应模型。在创建WebRequest类实例时,请注意下面二个问题:

      (1).一般不采用WebRequest类提供的构造函数,而使用其的Creat方法来创建并初始化WebRequest类实例。

      (2).HttpWebRequest类虽有构造函数。但使用复杂,所以并不提倡。请注意WebRequest类的Creat方法的语法,其语法如下:

    public static WebRequest Create (

    Uri requestUri

    ) ;

      当以“http://”或者“https://” 开头的URI传递到上面的requestUri参数中时,Create方法返回其实虽为WebRequest实例,但此实例的实质为HttpWebRequest实例。在下面内容中WebRequest的主要作用就是为创建HttpWebRequest 实例。表03是WebRequest类中的常用属性和方法及其说明: 

    属性 说明
    ConnectionGroupName 获取或设置请求的连接组的名称。
    ContentLength 获取或设置所发送的请求数据的内容长度。
    ContentType 获取或设置所发送的请求数据的内容类型。
    Credentials 获取或设置用于对Internet资源请求进行身份验证的网络凭据。
    Headers 获取或设置与请求关联的标头名称/值对的集合。
    Method 获取或设置要在此请求中使用的协议方法。
    PreAuthenticate 指示是否对请求进行预先身份验证。
    Proxy 获取或设置用于访问此Internet资源的网络代理。
    RequestUri 获取与请求关联的Internet资源的
    Timeout 获取或设置请求超时前的时间长度。


    表03:WebRequest类的常用属性及其说明

      2. HttpWebRequest类:

      HttpWebRequest类主要是实现上面介绍的HTTP会话中的第一、二步骤。当创建完HttpWebRequest实例后,并设定HttpWebRequest实例的“GET”属性后,HTTP请求信息中的请求行就定义完成了。定义HTTP请求信息中的请求头,并把请求信息发送出去就需要了解、掌握HttpWebRequest类中的方法和属性。表04是定义HTTP请求头对应的HttpWebRequest类属性和方法,表05是HttpWebRequest类常用方法及其说明。 

    请求头 设置
    Accept 由Accept属性设置。
    Connection 由Connection属性和KeepAlive属性设置。
    Content-Length 由ContentLength属性设置。
    Content-Type 由ContentType属性设置。
    Expect 由Expect属性设置。
    Date 由系统自动设置为当前日期。
    Host 由系统自动设置为当前主机信息。
    If-Modified-Since 由IfModifiedSince 属性设置。
    Range 由AddRange方法设置。
    Referer 由Referer属性设置。
    Transfer encoding 由TransferEncoding属性或SendChunked属性设置。
    User Agent 由UserAgent属性设置。


    表04:设定HTTP请求头对应HttpWebRequest类方法或属性

    方法 说明
    Abort 取消对Internet资源的请求。
    AddRange 向请求添加范围标头。
    BeginGetRequestStream 开始对用来写入数据的Stream实例进行异步请求。
    BeginGetResponse 开始对Internet资源的异步请求。
    EndGetRequestStream 结束对用于写入数据的Stream实例的异步请求。
    EndGetResponse 结束对Internet资源的异步请求。
    GetRequestStream 获取用于写入请求数据的Stream实例。
    GetResponse 返回来自Internet资源的响应。


    表05:HttpWebRequest类常用属性及其说明

      其中“BeginGetRequestStream”和“EndGetRequestStream”、“BeginGetResponse”和“EndGetResponse”是二对异步方法,其功能分别相当于“GetRequestStream”和“GetResponse”方法。

      3. HttpWebResponse类:

      HttpWebResponse类主要用以实现HTTP会话中的后面二个步骤。下面介绍的示例中的HttpWebResponse类起的主要作用获得服务器响应的数据,其中包括应答头。HttpWebResponse类虽提供了构造函数,但HttpWebResponse类实例的创建并不使用这个构造函数,这一点和HttpWebRequest类非常相似。而是通过HttpWebRequest类的“GetResponse”方法,此方法是当对指定的URI提出请求通过后,远程Internet资源返回的响应,下面是“GetResponse”方法的语法:

    public override WebResponse GetResponse ( ) ;

      可见,如果成功返回,则GetResponse方法返回的是包含来自Internet资源的响应的WebResponse实例。但这个返回的实例实质的类型是HttpWebResponse。在Visual Basic .Net中可以通过类型转换就可得到程序中所要使用的HttpWebResponse实例,从而为获取从WWW主机反馈的数据。表06和表07分别是HttpWebResponse类的常用属性和方法及其说明。 

    属性 说明
    CharacterSet 获取响应的字符集。
    ContentEncoding 获取用于对响应的体进行编码的方法。
    ContentLength 获取请求返回的内容的长度。
    ContentType 获取响应的内容类型。
    Cookies 获取或设置与此请求关联的Cookie。
    Headers 获取与来自服务器的响应关联的标头。
    LastModified 获取最后一次修改响应内容的日期和时间。
    Method 获取用于返回响应的方法。
    ProtocolVersion 获取响应中使用的HTTP协议的版本。
    ResponseUri 获取响应请求的Internet资源的
    Server 获取发送响应的服务器的名称。
    StatusCode 获取响应的状态。
    StatusDescription 获取与响应一起返回的状态说明。


    表06:HttpWebResponse类的常用属性及其说明

    方法 说明
    Close 关闭响应流。
    GetResponseHeader 获取与响应一起返回的指定应答头内容。
    GetResponseStream 获取用于读取来自服务器的响应的数据流。


    表07:HttpWebResponse类的常用属性及其说明

      以上介绍的三个类,是Visual Basic .Net编写基于HTTP协议网络应用程序所必须掌握的。当然在.Net FrameWork SDK为能够更好的处理HTTP中各种问题,还提供了许多类,其中包括用以处理身份认证的类,如NetworkCredential和CredentialCache类等。这些类就不具体介绍了。下面就结合若干具体的示例来了解、掌握在Visual Basic .Net使用上述类来实现HTTP协议的方法。

    (三)

    三.本文程序设计、调试和运行的环境:

      (1).微软公司视窗2000服务器版。

      (2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705。

      四.Visual Basic .Net实现HTTP会话的请求头并获取应答头

      下面示例可以自定义HTTP会话中的请求头中各单位的数据,并获取从WWW主机返回的应答头,并从中提取重要的属性对应的数据,具体的实现方法请参阅下面的实现步骤,以下就是用Visual Basic .Net实现HTTP会话的请求头并获取应答头项目的具体实现步骤:

      1. 启动Visual Studio .Net。

      2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。

      3. 将【项目类型】设置为【Visual Basic项目】。

      4. 将【模板】设置为【Windows应用程序】。

      5. 在【名称】文本框中输入【Visual Basic .Net中实现HTTP协议】。

      6. 在【位置】的文本框中输入【E:VS.NET项目】,然后单击【确定】按钮,这样在“E:VS.NET项目”目录中就产生了名称为“Visual Basic .Net中实现HTTP协议”的文件夹,并在里面创建了名称为“Visual Basic .Net中实现HTTP协议”的项目文件。具体如图02所示

    Visual Basic .Net中实现HTTP协议(三)(图一)
    图02:【新建项目】对话框

      7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并如图3那样排列和修改相应属性:

    Visual Basic .Net中实现HTTP协议(三)(图二)
    图03:设计界面

      一个Button组件,其功能也是向Web主机发送定制的GET命令,并获得从Web主机反馈来的应答头。并在这个Button组件拖入Form1的设计窗体后,双击它,则系统会在Form1.vb文件分别产生这个组件的Click事件对应的处理代码。

      8. 在Form1.vb文件的最前面添加下列代码,下列代码在Form1.vb中导入程序中要使用的类所在的命名空间:

    Imports System.Net

      9. 用下列代码替换Form1.vb中的Button1的Click事件对应的处理代码,下列代码功能是定制HTTP请求头向给定的URI地址发送GET命令,并提取从WWW主机反馈的应答头数据:

    Dim myHttpWebRequest As HttpWebRequest

    Dim myHttpWebResponse As HttpWebResponse

    Try

    Dim URL As String = textBox1.Text

    Dim myUri As Uri = New Uri ( textBox1.Text )

    Dim myWebRequest As WebRequest = WebRequest.Create ( URL )

    '使用Creat方法创建WebRequest实例

    myHttpWebRequest = CType ( myWebRequest , HttpWebRequest )

    '实现WebRequest类型和HttpWebRequest类型的转换

    ' 以下代码是设定请求头,如果请求头

    ' 没有设置则采用系统缺省的设置

    myHttpWebRequest.KeepAlive = True

    '设定此HTTP连接是否是永久连接

    myHttpWebRequest.Timeout = 300000

    '设定此HTTP连接的超时时限,请注意这里的单位是毫秒

    myHttpWebRequest.Method = "GET"

    '设定请求命令类型



    ' 以下代码是发送请求信息,并从获得的响应信息中

    ' 提起应答头中各属性数据

    Dim myWebResponse As WebResponse = myHttpWebRequest.GetResponse ( )

    '获得响应信息

    myHttpWebResponse = CType ( myWebResponse , HttpWebResponse )

    '实现从WebResponse类型到HttpWebResponse类型转换

    ' 以下代码是从响应信息中提起应答头

    textBox2.Text = myHttpWebResponse.ContentType.ToString ( )

    '获得“内容类型”应答头

    textBox3.Text = myHttpWebResponse.ContentLength.ToString ( )

    '获得“内容长度”应答头

    textBox4.Text = myHttpWebResponse.Method.ToString ( )

    '获得“方法”应答头

    Dim iStatCode As Integer = CInt ( myHttpWebResponse.StatusCode )

    '获得“状态码”应答头

    textBox5.Text = iStatCode.ToString ( )

    textBox6.Text = myHttpWebResponse.ProtocolVersion.ToString ( )

    '获得“协议版本”应答头

    textBox7.Text = myHttpWebResponse.Server.ToString ( )

    '获得“服务器”应答头

    textBox8.Text = myHttpWebResponse.Headers.ToString ( )

    '显示从Internet资源返回的所有应答信息

    Catch WebExcp As WebException

    MessageBox.Show ( WebExcp.Message.ToString ( ) )

    Catch ex As Exception

    MessageBox.Show ( ex.ToString ( ) )

    End Try

    End Sub


      10. 至此,在上述步骤都正确执行后,【Visual Basic .Net中实现HTTP协议】项目的全部工作就完成了。单击快捷键F5就可以运行程序,此时单击【GET命令】按钮后,程序就会向指定的URI地址发送GET命令,并把从WWW主机反馈的应答头按条目显示出来,具体如图04所示:

    Visual Basic .Net中实现HTTP协议(三)(图三)
    图04:运行界面

    (四)

    五.Visual Basic .Net实现查看网页内容

      下面介绍的示例的功能是查看给定给定的URI对应的Web页面的内容,此功能类似IE浏览器中的“查看源文件”。其主要使用的无非也是WebRequest、HttpWebRequest和远程Web主机创建HTTP连接,然后通过WebResponse和Http WebResponse获得从Web主机返回的数据流,这些数据流就是Web主机对应的Web页面的内容。是想的具体步凑与上面大致相同,只需要修改两个地方

      1. 在【名称】文本框中输入【Visual Basic .Net实现查看网页内容】。

      2. 在【位置】的文本框中输入【E:VS.NET项目】,然后单击【确定】按钮,这样在“E:VS.NET项目”目录中就产生了名称为“Visual Basic .Net实现查看网页内容”的文件夹,并在里面创建了名称为“Visual Basic .Net实现查看网页内容”的项目文件。

      3. 界面设计如图6:

    Visual Basic .Net中实现HTTP协议(四)(图一)
    图06:设计界面

      4. 在Form1.vb文件的最前面添加下列代码,下列代码在Form1.vb中导入程序中要使用的类所在的命名空间:

    Imports System.Net

    Imports System.IO

    '程序中使用到StreamReader类

    using System.Text ;

    '程序中使用到Encoding类


      7. 用下列代码替换Form1.vb中的Button1的Click事件对应的处理代码,下列代码功能是和指定的Web主机建立HTTP会话连接,并读取从Web主机反馈来的数据流:

    Private Sub button1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles button1.Click

    Dim myHttpWebRequest As HttpWebRequest

    Dim myHttpWebResponse As HttpWebResponse

    Try

    Dim URL As String = textBox1.Text

    Dim myUri As Uri = New Uri ( textBox1.Text )

    Dim myWebRequest As WebRequest = WebRequest.Create ( URL )

    '使用Creat方法创建WebRequest实例

    myHttpWebRequest = CType ( myWebRequest , HttpWebRequest )

    '实现WebRequest类型和HttpWebRequest类型的转换

    Dim myWebResponse As WebResponse = myHttpWebRequest.GetResponse ( )

    '获得响应信息

    myHttpWebResponse = CType ( myWebResponse , HttpWebResponse )

    Dim myStream As Stream = myHttpWebResponse.GetResponseStream ( )

    '获得从当前Internet资源返回的响应流数据

    Dim srReader As StreamReader = New StreamReader ( myStream , Encoding.Default )

    '利用获得的响应流和系统缺省编码来初始化StreamReader实例。

    Dim sTemp As String = srReader.ReadToEnd ( )

    '从响应流从读取数据

    srReader.Close ( )

    richTextBox1.Text = sTemp

    '显示读取的数据 ( )

    Catch WebExcp As WebException

    MessageBox.Show ( WebExcp.Message.ToString ( ) )

    Catch ex As Exception

    MessageBox.Show ( ex.ToString ( ) )

    End Try

    End Sub


      5. 至此在上述步骤都正确完成后,【Visual Basic .Net实现查看网页内容】项目的全部工作就基本完成了。此时单击快捷键F5运行程序后,单击程序中的【查看源文件】按钮就可以得到如图07所示的运行界面:


    图07:运行界面

      六.总结:

      本文详细介绍了.Net FrameWork SDK中提供的用以实现HTTP协议时主要的类及其成员,并通过二个具体示例的实现过程介绍了在Visual Basic .Net中使用这些类实现HTTP协议的具体方法。HTTP协议是TCP/IP协议簇中的重要协议,也是平常接触最多的一种协议,本文介绍的二个示例虽然结构不是很复杂,但无论是程序的功能,还是应用的层次都应该算是最基础,最重要的,掌握它们对掌握用Visual Basic .Net实现更深层次上,基于HTTP协议的网络应用程序应该是很有帮助的。

     

  • 相关阅读:
    How to add a button in the seletions "More"
    Tags Used In OpenERP 7.0
    OpenERP Web Client设置闲置有效时间
    OpenERP7.0中非admin帐号新增其它用户问题
    Docker 使用docker-compose部署项目
    Docker 安装docker-compose多容器管理服务
    Jenkins集成Docker实现镜像构建和线上发布
    Centos下安装JDK、Maven和Git
    服务注册发现与调度
    Spring boot centos部署启动停止脚本
  • 原文地址:https://www.cnblogs.com/MrLi/p/3300580.html
Copyright © 2011-2022 走看看