本章内容
7-1 网络基础
7-2 HTTP网络编程
7-3  TCP网络编程
在某些情况下,我们需要在Windows应用程序中获取Web站点信息或者访问网络服务器,本章讨论使用各种网络协议(主要是HTTPTCP协议)访问网络和Internet,包括文件的下载、网络接口编程等。
u本章学习目标:
n了解System. NetSystem.Net.Sockets命名空间
n掌握访问网络资源的基本方法
n可以使用不同协议通讯

7-1  网络基础

在学习网络编程之前,我们要对网络通信原理有个基本认识。与网络相关的课程中,一个关键术语就是协议,什么是协议?协议是对等实体之间交换的帧、分组和报文的格式及意义的一组规则[1]。简单的说,协议就像一种国际通用语言,在不同国家之间进行交流时使用。
一般地将网络协议分层,主要有两种重要的网络体系即OSI七层参考模型和TCP/IP四层参考模型。我们常用的网络协议中HTTP协议位于模型中的应用层,是较高层协议;TCP协议位于模型中的传输层,是较低层协议。
Internet上,每一台机器都有自己的IP地址,IP地址是分配给每台主机(或路由器)的一个在全世界范围内惟一的标识符。一个IP地址主要由两部分组成:一部分是用于标识该地址所从属的网络标识,另一部分用于指明该网络上某个特定主机的主机号。目前,大多数IP编址方案仍采用IPv4编址方案,即使用32位的二进制地址进行识别,我们常见的形式是将32位的IP地址分成4段,然后把4个段分别用十进制表示,中间用圆点分开,这种方法叫做点分十进制表示法也是字符串表示法。
但是通常我们在浏览器的地址栏里输入主机名称(DNS)或域名,比如www.sina.com,在实际连接过程中,需将名称转为地址进行连接,这其中需要域名解析服务器来完成这个工作。.NET framework中提供了相应的操作IP地址类和主机信息类。

1 案例学习:IP地址类

IPAddress类代表IP地址,可在十进制表示法和实际的整数地址之间进行转换。IPHostEntry类封装了与主机相关的信息。Dns类可以检索IP地址和获取主机名。
u实验步骤(1):
新建一个Winform项目,本项目主要实现IP地址和主机名称的相互转换。
u实验步骤(2):
在新建的Winform窗体上,从工具箱之中拖拽三个textbox控件、一个listBox控件和一个button控件,按照图7-1进行控件布局。
7-1 网络编程技术(上) _网络编程
7-1 IP地址类的使用
u实验步骤(3):
用鼠标双击“地址转换”按钮,添加源代码如下:
  
private void button1_Click(object sender, EventArgs e)
{
IPHostEntry host = Dns.Resolve(txtUrl.Text);
foreach (IPAddress add in host.AddressList)
{
                long ip = add.Address;
                listBox1.Items.Add(add.ToString());
                listBox1.Items.Add(ip.ToString());
}
txtName.Text = host.HostName;
txtBroad.Text = IPAddress.Broadcast.ToString();
}
 
 
问题讨论:
1IPAddress类的Address属性是Long长整型的数字,表示以点间隔的32位字符串地址对应的整数,其中第三个文本框显示的是广播地址。
    2HostName属性显示的主机名称可能与输入的名称不同,可能有存在域名名称代理的情况

7-2  HTTP网络编程

7-2-1  WebClient

提供用于将数据发送到由 URI 标识的资源及从这样的资源接收数据的常用方法。主要成员,如表7-1所示:
方法
说明
以字符串形式下载位于指定 Uri 的资源。
打开流向指定资源的可读流。
打开一个流以将数据写入指定的资源。这些方法不会阻止调用线程。
将指定的字符串上载到指定的资源。这些方法不会阻止调用线程。
属性
说明
获取一个值,该值指示某一 Web 请求是否处于进行中。
获取或设置 WebClient 发出请求的基 URI
7-1

1案例学习:文件下载

本次实验目标是使用WebClient类的方法进行简单的网络数据获取。
u实验步骤(1):
新建一个Winform项目,并在当前新建项目的窗体上添加一个按钮和一个文本框和一个RichTextBox控件。本案例用以实现当用户在文本框中输入文件的网络位置,单击按钮时,将文件下载到本地,并将结果显示在RichTextBox中,将RichTextBox的只读属性设置为True。界面布局设置如图7-2所示。
u实验步骤(2):用鼠标双击“下载”按钮,添加功能源代码如下:
private void button1_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
Stream s = client.OpenRead(txtUrl.Text);
StreamReader reader = new StreamReader(s);
rtbResult.Text = reader.ReadToEnd();
    reader.Close();
s.Close();
}
7-1 网络编程技术(上) _职场_02
7-2 WebClient下载网页
这里看到的是Google首页的源文件,和我们在IE浏览器中打开Google首页时单击右键->查看源文件,看到的内容是相同的,是在浏览器中返回的静态html文件。

7-2-2 WebRequest类和WebResponse

WebClient类使用上比较简单,但是功能有限,而且不能提供身份验证相关信息,因此基于安全性考虑,并不是很实用。如果使用某种特定协议,需要结合使用WebRequest类和WebResponse类。WebRequest类用于发出对一个URI的请求,是抽象类,使用时需结合具体协议从其派生,其主要成员,如表7-2所示:
方法
说明
Create
创建对象
GetResponse
在子类中被重写时,返回对 Internet 请求的响应。
子类中重写时,返回用于将数据写入 Internet 资源的 Stream
属性
说明
在子类中被重写时,获取或设置所发送的请求数据的内容长度。
在子类中被重写时,获取或设置所发送的请求数据的内容类型。
当在子类中被重写时,获取或设置用于对 Internet 资源请求进行身份验证的网络凭据。
子类中被重写时,获取或设置要在此请求中使用的协议方法。
获取与请求关联的 Internet 资源的 URI
在子类中被重写时,获取或设置与请求关联的标头名称/值对的集合。
7-2
WebResponse类代表从服务器获取的数据,主要成员,如表7-3所示:
方法
说明
子类中重写时,从 Internet 资源返回数据流。
属性
说明
在子类中被重写时,获取或设置所发送的请求数据的内容长度。
在子类中被重写时,获取或设置所发送的请求数据的内容类型。
在子类中被重写时,获取或设置与请求关联的标头名称/值对的集合。
7-3

1案例学习:获取HTTP Headers信息

本次实验目标是使用HTTP协议,使用派生类HttpWebRequestHttpWebResponse
u实验步骤(1):
新建一个Winform项目,并在当前新建项目的窗体上添加一个按钮和一个列表框ListBox控件。本案例用以实现当用户从指定的网络位置,单击按钮时,将网络请求生成的Headers信息显示在ListBox中。将URI作为参数传送给Create方法,创建合适的对象;GetResponse方法把请求发送给服务器,并检查返回的数据;GetResponseStream方法获取返回的数据流。界面布局设置如图7-3所示。
u实验步骤(2):用鼠标双击“Headers”按钮,添加功能源代码:
private void button1_Click(object sender, EventArgs e)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(txtUrl.Text);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
NameValueCollection headers = res.Headers;
foreach (string name in headers)
{
listBox1.Items.Add(name + "-------" + headers[name]);
}
}
7-1 网络编程技术(上) _休闲_03
7-3 获取Http Headers信息
这里看到的是响应流中的Headers信息,分割线---之前是信息的名称,之后是信息的内容。如果链接的目标服务器需要身份验证,则需要通过NetworkCredential类提供相关身份信息。

7-2-3 Web浏览器控件

前面的例子我们看到的都是纯文本的结果显示,如果希望象网站那样浏览数据,可以在windows应用中直接添加浏览器控件。2.0以上版本已将WebBrowser控件加入工具箱,不需手动添加项。

1 案例学习:在窗体中显示网页

本次实验目标是使用Web浏览器控件。
u    实验步骤(1):
新建一个Winform项目,并在当前新建项目的窗体上添加一个按钮和文本框,在工具箱中找到WebBrowser控件,并拖拽到窗体上。本案例用以实现在文本框中输入www.baidu.com,单击按钮时,在浏览器控件中显示出该网站的页面。界面布局设置如图7-4所示。
u       实验步骤(2):用鼠标双击“链接到”按钮,添加功能源代码:
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(textBox1.Text, false);
}
其中使用WebBrowser类的Navigate方法发送HTTP请求,显示来自给定URI的输出,第一个参数包含给定URL的字符串,第二个参数是布尔类型,表示是否在新窗口显示。运行结果如下图:
7-1 网络编程技术(上) _休闲_04
7-4 WebBrowser控件