C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)
目录
一、System.Net命名空间
1.Dns类
(1)示例源码
(2)生成效果
2.IPAddress类
(1)示例源码
(2)生成效果
3.IPEndPoint类
(1) 示例源码
(2)生成效果
4.WebClient类
(1) 示例源码
(2)生成效果
5.WebRequest类和WebResponse类
(1) 示例源码
(2)生成效果
C#作为一种编程语言,它提供了对网络编程的全面支持。使用C#进行网络编程时,通常都需要使用System.Net命名空间和System.Net.Sockets命名空间。
一、System.Net命名空间
System.Net命名空间为当前网络上使用的多种协议提供了简单的编程接口,而它所包含的WebRequest类和WebResponse类形成了所谓的可插接式协议的基础,可插接式协议是网络服务的一种实现,它使用户能够开发出使用Internet资源的应用程序,而不必考虑各种不同协议的具体细节。
1.Dns类
Dns类是一个静态类,它从Internet域名系统(DNS)检索关于特定主机的信息。在IPHostEntry类的实例中返回来自DNS查询的主机信息。如果指定的主机在DNS数据库中有多个入口,则IPHostEntry包含多个IP地址和别名。Dns类的常用方法及说明:
方 法 | 说 明 |
BeginGetHostAddresses | 异步返回指定主机的Internet 协议(IP)地址 |
BeginGetHostByName | 开始异步请求关于指定 DNS主机名的IPHostEntry 信息 |
EndGetHostAddresses | 结束对 DNS信息的异步请求 |
EndGetHostByName | 结束对 DNS信息的异步请求 |
EndGetHostEntry | 结束对 DNS信息的异步请求 |
GetHostAddresses | 返回指定主机的Internet 协议(IP)地址 |
GetHostByAddress | 获取 IP地址的 DNS 主机信息 |
GetHostByName | 获取指定 DNS 主机名的 DNS信息 |
GetHostEntry | 将主机名或 IP地址解析为IPHostEntry 实例 |
GetHostName | 获取本地计算机的主机名 |
(1)示例源码
//根据主机网址获取主机IP、主机DNS、主机名、本机名
using System.Net;
namespace _01_1
{
public partial class Form1 : Form
{
private Label? label1;
private Label? label2;
private Label? label3;
private Label? label4;
private Button? button1;
private TextBox? textBox1;
private TextBox? textBox2;
private TextBox? textBox3;
private TextBox? textBox4;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
private void Button1_Click(object? sender, EventArgs e)
{
if (textBox1!.Text == string.Empty)//判断是否输入了主机地址
{
MessageBox.Show("请输入主机地址!");
}
else
{
textBox2!.Text = string.Empty;
IPAddress[] ips = Dns.GetHostAddresses(textBox1.Text); //获取指定主机的IP地址
foreach (IPAddress ip in ips) //循环访问获得的IP地址
{
textBox2.Text = ip.ToString();//将得到的IP地址显示在文本框中/获取本机名
}
textBox3!.Text = Dns.GetHostName();
}
textBox4!.Text = Dns.GetHostEntry(Dns.GetHostName()).HostName;//根据指定的主机名获取DNS信息
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(12, 9),
Name = "label1",
Size = new Size(43, 17),
TabIndex = 0,
Text = "输入主机网址:"
};
//
// label2
//
label2 = new Label
{
AutoSize = true,
Location = new Point(12, 39),
Name = "label2",
Size = new Size(43, 17),
TabIndex = 1,
Text = "主机IP地址:"
};
//
// label3
//
label3 = new Label
{
AutoSize = true,
Location = new Point(195, 39),
Name = "label3",
Size = new Size(43, 17),
TabIndex = 2,
Text = "本地主机名:"
};
//
// label4
//
label4 = new Label
{
AutoSize = true,
Location = new Point(12, 67),
Name = "label4",
Size = new Size(43, 17),
TabIndex = 3,
Text = "DNS主机名:"
};
//
// button1
//
button1 = new Button
{
Location = new Point(317, 3),
Name = "button1",
Size = new Size(75, 23),
TabIndex = 4,
Text = "确定",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(95, 6),
Name = "textBox1",
Size = new Size(140, 23),
TabIndex = 5
};
//
// textBox2
//
textBox2 = new TextBox
{
Location = new Point(95, 33),
Name = "textBox2",
Size = new Size(100, 23),
TabIndex = 6
};
//
// textBox3
//
textBox3 = new TextBox
{
Location = new Point(270, 33),
Name = "textBox3",
Size = new Size(120, 23),
TabIndex = 7
};
//
// textBox4
//
textBox4 = new TextBox
{
Location = new Point(95, 61),
Name = "textBox4",
Size = new Size(120, 23),
TabIndex = 8
};
// Form1
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(404, 93);
Controls.Add(textBox4);
Controls.Add(textBox3);
Controls.Add(textBox2);
Controls.Add(textBox1);
Controls.Add(button1);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Name = "Form1";
Text = "获取主机IP";
}
}
}
(2)生成效果
2.IPAddress类
IPAddress类包含计算机在IP网络上的地址,它主要用来提供网际协议(IP)地址。IPHostEntry类将一个域名系统(DNS)主机名与一组别名和一组匹配的IP地址关联。
字段、属性及方法 | 说 明 |
Any字段 | 提供一个IP地址,指示服务器应侦听所有网络接口上的客户端活动。此字段为只读 |
Broadcast字段 | 提供1P 播地址。此学段为只读 |
Loopback字段 | 提供IP环回地址。此字段为只读 |
None字段 | 提供指示不应使用任何网络接口的IP地址。此字段为只读 |
Address属性 | 网际协议(IP)地址 |
AddressFamily属性 | 获取IP地址的地址族 |
IsIPv6LinkLocal属性 | 获取地址是否为IPv6链接本地地址 |
IsIPv6Multicast属性 | 获取地址是否为IPv6多路广播全局地址 |
IsIPv6SiteLocal属性 | 获取地址是否为IPv6站点本地地址 |
Scopeld属性 | 获取或设置IPv6地址范围标识符 |
GetAddressBytes)方法 | 以字节数组形式提供IPAddress的副本 |
IsLoopback()方法 | 指示指定的IP地址是否是环回地址 |
Parse)方法 | 将IP地址字符串转换为IPAddress实例 |
TryParse)方法 | 砷定字符甲是否为有效的IP地址 |
(1)示例源码
//输入主机网址获取其IP地址
using System.Net;
namespace _02
{
public partial class Form1 : Form
{
private Label? label1;
private Label? label2;
private Button? button1;
private TextBox? textBox1;
private TextBox? textBox2;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
private void Button1_Click(object? sender, EventArgs e)
{
textBox2!.Text = string.Empty; //初始化Label标签
IPAddress[]ips =Dns.GetHostAddresses(textBox1!.Text); //获得指定主机的IP地址族
foreach (IPAddress ip in ips) //循环遍历得到的IP地址
textBox2.Text ="网际协议地址:"+ ip.Equals(IPAddress.Any) + "; \n" + "IP地址的地址族:" +
ip.AddressFamily.ToString() + "; \n" + "是否IPv6链接本地地址:" + ip.IsIPv6LinkLocal;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(12, 9),
Name = "label1",
Size = new Size(43, 17),
TabIndex = 0,
Text = "输入网址:"
};
//
// label2
//
label2 = new Label
{
AutoSize = true,
Location = new Point(12, 41),
Name = "label2",
Size = new Size(43, 17),
TabIndex = 1,
Text = "显示IP:"
};
//
// button1
//
button1 = new Button
{
Location = new Point(317, 12),
Name = "button1",
Size = new Size(75, 23),
TabIndex = 4,
Text = "确定",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(96, 12),
Name = "textBox1",
Size = new Size(215, 23),
TabIndex = 5
};
//
// textBox2
//
textBox2 = new TextBox
{
Location = new Point(95, 41),
Multiline = true,
Name = "textBox2",
Size = new Size(297, 80),
TabIndex = 6
};
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(404, 130);
Controls.Add(textBox2);
Controls.Add(textBox1);
Controls.Add(button1);
Controls.Add(label2);
Controls.Add(label1);
Name = "Form1";
StartPosition = FormStartPosition.CenterScreen;
Text = "获取IP地址";
}
}
}
(2)生成效果
3.IPEndPoint类
IPEndPoint类包含应用程序连接到主机上的服务所需的主机和本地或远程端口信息。通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点,它主要用来将网络端点表示为IP地址和端口号。
字段及属性 | 说 明 |
MaxPort字段 | 指定可以分配给Port属性的最大值。MaxPort值设置为0x0000FFFF。此字段为只读 |
MinPort字段 | 指定可以分配给Port属性的最小值。此字段为只读 |
Address属性 | 获取或设置终结点的IP地址 |
AddressFamily属性 | 获取网际协议(IP)地址族 |
Port属性 | 获取或设置终结点的端口号 |
(1) 示例源码
// 获取IP地址的端口号
using System.Net;
namespace _03
{
public partial class Form1 : Form
{
private Label? label1;
private Label? label2;
private Button? button1;
private TextBox? textBox1;
private TextBox? textBox2;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
/// <summary>
/// 实例化IPEndPoint类对象
/// 使用IPEndPoint类对象获取终结点的IP地址和端口号
/// </summary>
private void Button1_Click(object? sender, EventArgs e)
{
IPEndPoint IPEPoint = new(IPAddress.Parse(textBox1!.Text), 80);
textBox2!.Text = "IP地址:" + IPEPoint.Address.ToString() + " \n端口号:" + IPEPoint.Port;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(12, 9),
Name = "label1",
Size = new Size(43, 17),
TabIndex = 0,
Text = "输入IP地址:"
};
//
// label2
//
label2 = new Label
{
AutoSize = true,
Location = new Point(12, 41),
Name = "label2",
Size = new Size(43, 17),
TabIndex = 1,
Text = "显示端口号:"
};
//
// button1
//
button1 = new Button
{
Location = new Point(317, 12),
Name = "button1",
Size = new Size(75, 23),
TabIndex = 4,
Text = "确定",
UseVisualStyleBackColor = true
};
button1.Click += Button1_Click;
//
// textBox1
//
textBox1 = new TextBox
{
Location = new Point(96, 12),
Name = "textBox1",
Size = new Size(215, 23),
TabIndex = 5
};
//
// textBox2
//
textBox2 = new TextBox
{
Location = new Point(95, 41),
Multiline = true,
Name = "textBox2",
Size = new Size(297, 80),
TabIndex = 6
};
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(404, 130);
Controls.Add(textBox2);
Controls.Add(textBox1);
Controls.Add(button1);
Controls.Add(label2);
Controls.Add(label1);
Name = "Form1";
StartPosition = FormStartPosition.CenterScreen;
Text = "获取IP地址的端口号";
}
}
}
(2)生成效果
4.WebClient类
WebClient类提供向URI标识的任何本地、Intranet或Internet资源发送数据以及从这些资源接收数据的公共()方法。
默认情况下,WebClient实例不发送可选的HTTP报头。如果要发送可选报头,必须将该报头添加到Headers(哈希表)集合中。
属性及方法 | 说 明 |
BaseAddress属性 | 获取或设置WebClient发出请求的基URI |
Encoding属性 | 获取和设置用于上传和下载字符串的Encoding |
Headers属性 | 获取或设置与请求关联的报头名称/值对集合 |
QueryString属性 | 获取或设置与请求关联的查询名称/值对集合 |
ResponseHeaders属性 | 获取与响应关联的报头名称/值对集合 |
DownloadData()方法 | 以Byte数组形式通过指定的URI下载 |
DownloadFile)方法 | 将具有指定URI的资源下载到本地文件 |
DownloadString()方法 | 以String或URI形式下载指定的资源 |
OpenReadO方法 | 为从具有指定URI的资源下载的数据打开一个可读的流 |
OpenWrite)方法 | 打开一个流以将数据写入具有指定URI的资源 |
UploadDataO方法 | 将数据缓冲区上传到具有指定URI的资源 |
UploadFileO方法 | 将本地文件上传到具有指定URI的资源 |
UploadStringO方法 | 将指定的字符串上传到指定的资源 |
UploadValuesO方法 | 将名称/值集合上传到具有指定URI的资源 |
(1) 示例源码
(2)生成效果
5.WebRequest类和WebResponse类
WebRequest类是.NET Framework的请求/响应模型的抽象基类,用于访问Internet数据。使用该请求/响应模型的应用程序可以用协议不可知的方式从Internet请求数据,在这种方式下,应用程序处理WebRequest类的实例,而协议特定的子类则执行请求的具体细节。
WebResponse类也是抽象基类,应用程序可以使用WebResponse类的实例以协议不可知的方式参与请求和响应事务,而从WebResponse类派生的协议类携带请求的详细信息。另外,需要注意的是,客户端应用程序不直接创建WebResponse对象,而是通过对WebRequest实例调用GetResponse()方法来进行创建。
WebRequest类的常用属性、方法及说明
属性及方法 | 说 明 |
ConnectionGroupName属性 | 当在子类中重写时,获取或设置请求的连接组的名称 |
ContentLength属性 | 当在子类中被重写时,获取或设置所发送的请求数据的内容长度 |
ContentType属性 | 当在子类中被重写时,获取或设置所发送的请求数据的内容类型 |
Headers属性 | 当在子类中被重写时,获取或设置与请求关联的报头名称/值对的集合 |
Method属性 | 当在子类中被重写时,获取或设置要在此请求中使用的协议方法 |
RequestUri属性 | 当在子类中被重写时,获取与请求关联的Internet资源的URI |
Timeout属性 | 获取或设置请求超时前的时间长度 |
Abot)方法 | 中止请求 |
BeginGetResponse)方法 | 当在子类中被重写时,开始对Intemet资源的异步请求 |
CreateO方法 | 初始化新的WebRequest对象 |
EndGetResponseO方法 | 当在子类中重写时,返回WebResponse对象 |
GetRequestStreamO方法 | 当在子类中重写时,返回用于将数据写入Intemet资源的Stream |
GetResponse)方法 | 当在子类中被重写时,返回对Internet请求的响应 |
RegisterPrefixO方法 | 为指定的URI注册WebRequest对象 |
WebResponse类的常用属性、方法及说明
属性及方法 | 说 明 |
ContentLength 属性 | 当在子类中重写时,获取或设置接收的数据的内容长度 |
ContentType 属性 | 当在派生类中重写时,获取或设置接收的数据的内容类型 |
Headers 属性 | 当在派生类中重写时,获取与此请求关联的报头名称/值对的集合 |
ResponseUri 属性 | 当在派生类中重写时,获取实际响应此请求的Intemet 资源的 URI |
Close)方法 | 当由子类重写时,将关闭响应流 |
GetResponseStream)方法 | 当在子类中重写时,从 Intenet 资源返回数据流 |
客户端应用程序不直接创建WebResponse对象,而是通过对WebRequest实例调用GetResponse()方法来进行创建。