Visual Basic .Net中实现HTTP协议

来源:互联网 发布:linux kill -9 重启 编辑:程序博客网 时间:2024/05/02 04:46
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主机发送请求命令。


图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属性设置。Transferencoding 由TransferEncoding属性或SendChunked属性设置。 UserAgent 由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所示


图02:【新建项目】对话框

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


图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所示:


图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:


图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协议的网络应用程序应该是很有帮助的。
原创粉丝点击