笔记2:WebRequest 及 WebResponse 类介绍


一、WebRequest 及 WebResponse 类运行机制

          WebRequest对象负责链接到远端服务器主机,并且将客户端的要求消息,传送到服务器;

          WebResponse对象则封装服务器响应的消息内容,最后客户端通过WebResponse对象,取得其中的内容。

 

          若仅是单纯地要求与响应操作,只需进行链接动作,然后取得响应的WebResponse 对象即可。

          若是牵涉到数据的写入或是读取,需结合数据流进行实际应用。

          笔记2:WebRequest 及 WebResponse 类介绍_第1张图片

           WebRequests在向服务器提出链接要求的同时,进一步通过数据流对象将数据写入;在返回的WebResponse对象中,取得响应的数据流,读取服务器响应的数据内容。

 

二、创建WebRequest 与 WebResponse 对象

           WebRequest是抽象类,本身并不包含用以建立实体对象所需的公用表达式,无法利用此类直接进行网络数据的存取操作。可用Create()方法建立WebRequest类实体

PublicShared Function Create(String) As WebRequest
PublicShared Function Create(ByVal requestUri As Uri) As WebRequest


        Response对象响应所需的消息数据,方法GetResponse()返回此结果对象:

Public FunctionGetResponse() As WebResponse

    返回的WebResponse对象,它提供的方法成员,取得网络服务器端所返回的数据内容。

 

三、数据流的去与回

         数据流向服务器发送:

             WebRequest的方法成员GetRequestStream返回一个Stream类对象,你可以由此对象将数据写入因特网,这个方法被定义为Overridable,必须在衍生的子类中覆写:

OverridablePublic Function GetRequestStream() As Stream

         从服务器取得:

              WebResponse的方法成员GetResponseStream,返回一个Stream数据流对象,这个对象封装了服务器的相关响应消息,此方法同样必须在其衍生的子类里被覆写。

OverridablePublic Function GetResponeeStream() As Stream


四、读取网页源代码

         随便输入一个网页,用来读取返回的源代码信息。

             笔记2:WebRequest 及 WebResponse 类介绍_第2张图片

Imports System.IO
Imports System.Net
Imports System.Text
Public Class Form1
    Private Sub btnGet_Click(sender As Object, e As EventArgs) Handles btnGet.Click
        Dim wqRequest As WebRequest
        Dim wpResponse As WebResponse
        Dim myStream As Stream
        Dim strCode As String = ""
        Dim strAddress As String
        Dim byteCode(1024) As Byte
        Dim intNumber As Int32

        strAddress = txtAddress.Text
        '网络可能存在网址错误、网路中断等情况,用try安全代码
        Try
            '以网址向服务器发出请求,创建请求对象
            wqRequest = WebRequest.Create(strAddress)
            '取得发出请求后响应的对象
            wpResponse = wqRequest.GetResponse()
            '获取响应后的数据流
            myStream = wpResponse.GetResponseStream

            '数据流读出
            Do
                '一次读取1024字节
                intNumber = myStream.Read(byteCode, 0, 1024)
                '转为当前默认编码,收集到strCode中
                strCode &= Encoding.Default.GetString(byteCode, 0, 1024)
            Loop Until intNumber > 0
            myStream.Close()
        Catch ex As Exception
            txtCode.Text = ex.Message
        End Try

        txtCode.Text = strCode

    End Sub
End Class

            程序运行正常,但是结果不尽人意,可以看到网页源代码是残缺的,哪里出了问题呢?

      咱也没弄明白,难道是缓存1024有问题?


      改下缓存情况

Dim wqRequest As WebRequest
        Dim wpResponse As WebResponse
        Dim myStream As Stream
        Dim strCode As String = ""
        Dim strAddress As String
        Dim byteCode() As Byte
        Dim intNumber As Int32

        strAddress = txtAddress.Text
        '网络可能存在网址错误、网路中断等情况,用try安全代码
        Try
            '以网址向服务器发出请求,创建请求对象
            wqRequest = WebRequest.Create(strAddress)
            '取得发出请求后响应的对象
            wpResponse = wqRequest.GetResponse()
            '获取响应后的数据流
            myStream = wpResponse.GetResponseStream
            '取接收长度
            intNumber = wpResponse.ContentLength
            '定义缓冲长度
            ReDim byteCode(intNumber)
            '数据流读出
            Do
                '一次读取1024字节
                intNumber = myStream.Read(byteCode, 0, intNumber)
                '转为当前默认编码,收集到strCode中
                strCode &= Encoding.Default.GetString(byteCode, 0, intNumber)
            Loop Until intNumber > 0
            myStream.Close()
        Catch ex As Exception
            txtCode.Text = ex.Message
        End Try

        txtCode.Text = strCode


                           结果有点改善,但是源代码仍然没有显示完全 :

                           笔记2:WebRequest 及 WebResponse 类介绍_第3张图片

                    抓狂,到底哪里出了问题?

                    再改代码,用StreamReader来读整个响应流:

        Dim wqRequest As WebRequest
        Dim wpResponse As WebResponse
        Dim myStream As Stream
        Dim strCode As String = ""
        Dim strAddress As String
        Dim sr As StreamReader

        strAddress = txtAddress.Text
        '网络可能存在网址错误、网路中断等情况,用try安全代码
        Try
            '以网址向服务器发出请求,创建请求对象
            wqRequest = WebRequest.Create(strAddress)
            '取得发出请求后响应的对象
            wpResponse = wqRequest.GetResponse()
            '获取响应后的数据流
            myStream = wpResponse.GetResponseStream

            '直接读流
            sr = New StreamReader(myStream, Encoding.Default)
            txtCode.Text = sr.ReadToEnd     '全部读出

            myStream.Close()
            sr.Close()
        Catch ex As Exception
            txtCode.Text = ex.Message
        End Try

                       结果是完美的,源代码完美呈现。

                                                                笔记2:WebRequest 及 WebResponse 类介绍_第4张图片



总结本节:1、响应中读取数据流;

                    2、前2次网页源代码为什么会出现残缺?知道的,请留言。



你可能感兴趣的:(网络编程,VB.NET)