1、WebClient类

如果只是想从特定的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()方法把作为字节数组提供的二进制数据上传至指定的URI

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类使用简单,但是功能有限,尤其是不能提供身份验证证书,导致很多站点不接受这样的上传文件。

 2、WebRequest类和WebResponse类

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

介绍一个例子使用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 = ; 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();

3、把输出结果显示为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))
{
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();
}

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

C# 网络通信基础 总结的更多相关文章

  1. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  2. Android 学习笔记之网络通信基础+WebView....

    PS:加快学习进度...下周一完成Android网络通信...然后正式进入实战... 学习内容: 1.Android中Http基础... 2.Android中的Socket基础... 3.Androi ...

  3. HCNA之网络通信基础

    一.通信与网络 通信的概念我们并不陌生,在人类社会的起源和发展过程中,通信就直伴随着我们.般认为, 20世纪七.八十年代,人类社会已进入到信息时代,对于生活在信息时代的我们,通信的必要性和重要性更是不 ...

  4. Java网络通信基础编程

    一.同步阻塞方式(BIO) 方式一: 服务器端(Server): package com.ietree.basicskill.socket.mode1; import java.io.IOExcept ...

  5. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  6. 网络编程api bind函数细节 select 细节

    struct sockaddr_in bindaddr; bindaddr.sin_family = AF_INET; bindaddr.sin_addr.s_addr = htonl(INADDR_ ...

  7. Linux C高级编程——网络编程基础(1)

    Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是由于TCP/IP包括T ...

  8. 49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)

    在上章 48.QT-网络通信讲解1,我们学习了网络通信基础后,本章便来实战一篇.源码正在上传中,等下贴地址. PS:支持客户端和服务器,提供源码,并且服务器支持多客户端连入,并且可以指定与个别客户端发 ...

  9. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...

随机推荐

  1. 在vim中执行外部命令

    11.7.5  在Vim编辑器中执行Shell命令 有时需要在Vim编辑器中执行Shell命令,例如需要验证一个Shell命令是否正确,以便写入脚本中:需要在文件中引用某个Shell命令的输入等.本小 ...

  2. 学习KMP算法的一点小心得

    KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...

  3. 在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB'

    在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB' 解决方法:解决方法:             1.关闭MySQL数据库       2 ...

  4. Rhel6-hadoop分布式部署配置文档

    理论基础: Hadoop 分布式文件系统架构 HDFS 负责大数据存储 MapReduce 负责大数据计算 namenode  master守护进程 datanode  slaves上负责存储的进程 ...

  5. 黑马程序员——C语言基础 scanf函数 基本运算 三目运算符

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)scanf函数 1>  简单介绍一下scanf函数   这是在 ...

  6. Chrome 应用推荐 - 下载管理扩展: Chrono

    地址:http://goo.gl/JVdxvg Chrono下载管理器让你轻松高效地管理Chrome浏览器中的下载任务.Chrono与Chrome浏览器紧密地整合在一起,如菜单.工具栏支持等等.Chr ...

  7. getSingleResult 和 selectone

    都是返回一个对象,如果找到一个以上的对象会报错,这个在登录验证和添加的时候可能会有点小用,因为登录和添加的时候都要判断是不是数据库有这个username,登录的时候希望有,添加的时候希望没有,但是两者 ...

  8. JS 数组去重!!!

    var arr = [1,2,3,1,1,1,3,5,3,6,2]; var newArr=[]; for(var i = 0; i < arr.length-1; i++){ var onOf ...

  9. Bayeux

    Bayeux是一种用来在客户端和服务器端传输低延迟的异步消息(主要通过http)的一种协议.它定义的消息通过命名通道进行路由并且能够进行交互传 送:server -> client, clien ...

  10. hdu 2083

    ps:N个数中,中位数是最小距离...第一次WA是因为排序之后最小和最大相加除2...应该是找他们的中位数,而不是中间数. 代码: #include "stdio.h" #incl ...