C# 网络通讯基础 总结

一、WebClient类web

若是只是想从特定的URI(统一资源标识符)请求文件,则可使用最简单的.NET类,System.Net.WebClient。支持http:、https:和file:标识符开头的URI。URL统一资源定位符。编程

  • 下载文件
使用WebClient类下载文件有两种方法。
~若是只想把文件保存到磁盘上,就应该使用DownloadFile()方法。这个方法有两个参数:即文件的URI和保存所请求的数据的位置(路径和文件名):
WebClient client =new WebClient();
    client.DownloadFile("http://www.reuters.com/","ReutersHomepage.htm");

~更常见的是,应用程序须要处理从web站点检索到的数据,为此要使用OpenRead()方法,该方法返回一个Stream引用。而后就能够把数据从数据流中提取到内存中:数组

            WebClient client = new WebClient();
            Stream strm = client.OpenRead("http://www.baidu.com");
            StreamReader sr = new StreamReader(strm);
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                listBox1.Items.Add(line);
            }

            strm.Close();
            sr.Close();    

WebClient类还有一个OpenWrite()方法,它能够返回一个可写的数据流,便于用户把数据发送给URI。也能够指定用于把数据发送给主机的方法;默认的方法是POST。下面的代码假定在本地计算机上有一个可写的目录accept,这段代码在该目录下建立newfile.txt文件:浏览器

WebClient webClient=new WebClient();
Stream stream=webClient.OpenWrite(“http://localhost/accept/newfile.txt”,”PUT”)
StreamWriter streamWriter=new StreamWriter(stream);
streamWriter.WriteLine(“Hello World”);
streamWriter.Close();

 

  • 上传和更新

WebClient类提供UploadFile()和UploadData()方法。安全

UploadFile()方法将文件上传到指定位置,其中文件名已经给出;服务器

UploadData()方法把做为字节数组提供的二进制数据上传至指定的URIcookie

 

WebClient client = new WebClient();
            client.UploadFile("http://www.baidu.com/NewFile.htm", "C:\\WebSiteFIles\\NewFIle.htm");
            byte[] image;
            client.UploadData("http://www.ourwebsite.com/NewFile.jpg", image);

WebClient类使用简单,可是功能有限,尤为是不能提供身份验证证书,致使不少站点不接受这样的上传文件。网络

 二、WebRequest类和WebResponse函数

WebRequest类表明要给某个特定URI发送信息的请求,URI做为参数传递给Create()方法。WebResponse类表明从服务器检索的数据。调用WebRequest.GetResponse()方法,其实是把请求发送给Web服务器,并建立一个Response对象,以检查返回的数据。与WebClient对象同样,能够获得一个表明数据的数据流。可是这里的数据流使用WebResponse.GetResponseStream()方法得到。this

介绍一个例子使用WebRequest和WebResponse类,用来下载Web页面。

 WebRequest wrq = WebRequest.Create("http://www.reuters.com");
            WebResponse wrs = wrq.GetResponse();
            Stream strm = wrs.GetResponseStream();
            StreamReader sr = new StreamReader(strm);
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                listBox1.Items.Add(line);
            }
            sr.Close();
            strm.Close();

在这个例子中,首先对表明Web请求的对象进行实例化,但再次没有使用构造函数,而是调用静态的WebRequest.Create()方法。WebRequest类是支持不一样网络协议的类的层次结构 的一部分,为了给请求类型接收一个正确对象的引用,须要一个工厂机制。WebRequest.Create()方法会为给定的协议建立合适的对象。

Http协议的一个重要方面就是可以利用请求数据流和响应数据流发送扩展的标题信息。标题信息能够包括cookie以及发送请求的特定浏览器(用户代理)的详细信息。WebRequest类和WebResponse类提供了读取标题信息的一些支持。而两个派生的类HttpWebRequest和HttpWebResponse提供了其余HTTP特定的信息。

用HTTP URI建立WebRequest会生成一个HttpWebRequest对象实例。由于HttpWebRequest对象实例派生自WebRequest类,因此能够在须要WebRequest类的任何地方使用新实例。

在GetResponse()方法调用以前添加以下代码,能够检查两个标题属性的某些内容:

HttpWebRequest hwrq = (HttpWebRequest)wrq;
            listBox1.Items.Add("Request Timeout (ms) =" + wrq.Timeout);
            listBox1.Items.Add("Request Keep Alive = " + hwrq.KeepAlive);
            listBox1.Items.Add("Request AllowAutoRedirect = " + hwrq.AllowAutoRedirect);

AllowAutoRedirect属性专用于HttpWebRequest类,使用这个属性能够控制Web请求是否应自动跟随Web服务器上的重定向响应。默认值为true。若是只容许有限次数的重定向,就能够把HttpWebRequest类的MaximumAutomaticRedirections属性设置为指望的数值。

请求类和相应类以属性的形式提供大多数重要的标题,也可使用Headers属性自己显示标题的整个集合。在GetResponse()方法调用的后面添加以下代码,能够把全部标题放在列表框控件中:

   WebHeaderCollection whc = wrs.Headers;
            for (int i = 0; i < whc.Count; i++)
            {
                listBox1.Items.Add(string.Format("Header {0}:{1}", whc.GetKey(i), whc[i]));
            }

身份验证

WebRequest类中的另外一个属性是Credentials属性,若是把须要身份验证证书附带在请求中,就能够用用户名和密码建立NetWorkCredential类的一个实例。在调用GetResponse()方法以前,添加以下代码:

NetworkCredential myCred = new NetworkCredential("myusername", "mypassword");
            wrq.Credentials = myCred;

 

使用代理

公司若是使用代理服务器进行全部类型的HTTP或FTP请求,代理服务器经常使用某种形式的安全性,一般是用户名和密码,路由公司的全部请求和响应。对于使用WebClient对象或者WebRequest对象的应用程序,须要考虑这些代理服务器。与前面的NetworkCredential对象同样,在进行调用以执行实际请求以前,须要使用WebProxy对象。

            WebProxy wp = new WebProxy("192.168.1.100", true);
            wp.Credentials = new NetworkCredential("user1", "user1Password");
            WebRequest wrq = WebRequest.Create("http://www.baidu.com");
            wrq.Proxy = wp;


            WebResponse wrs = wrq.GetResponse();

 

三、把输出结果显示为HTML页面

以前介绍的下载文件都是纯文本显示的。

COM,Component Object Model,组件对象模型。

WebBrowser控件封装了COM对象,能够更方便完成任务。除了使用WebBrowser控件以外,另外一个选项是使用编程功能,从代码中调用Internet Explorer实例。

还可使用System.Diagnostics名称空间中的Process类,经过编程打开Internet Explorer进程,导航到给定的Web页。

Process myProcess = new Process();
            myProcess.StartInfo.FileName = "iexplore.exe";
            myProcess.StartInfo.Arguments = "http://www.baidu.com";
            myProcess.Start();

 

  • 从应用程序中进行简单的Web浏览
        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                webBrowser1.Navigate(textBox1.Text);
            }
        }

上述代码为TextBox控件按下回车键的代码。

  • 启动Internet Explorer实例
        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            WebBrowser wb = new WebBrowser();
            wb.Navigate("http://www.baidu.com", true);
        }

用户单击LinkLabel控件时,就会新建WebBrowser类的一个实例。而后使用WebBrowser类的Navigate() 方法,代码指定了Web页面的位置和一个布尔值,该布尔值表示在Windows窗体应用程序内部打开这个端点(false),仍是从一个单独的浏览器中打开这个端点(true)。

  • 给应用程序提供更多IE类型的功能

1的例子中,单击WebBrowser控件中的连接,TextBox控件中的文本不会更新,所以不能显示浏览过程的准确位置的URL。若是使用HTML页面的标题更新窗体的标题,应侦听WebBrowser控件中的事件,给控件添加处理程序。

        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            this.Text = webBrowser1.DocumentTitle.ToString();
        }

 

若是须要根据所查看页面的完整URL改变窗体的文本框,

        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            textBox1.Text = webBrowser1.Url.ToString();
            this.Text = webBrowser1.DocumentTitle.ToString();
        }

 

 

//后续还有一个简答的浏览器实例,时间来不及了,明天记录下来。

相关文章
相关标签/搜索