网络编程
- HTTP网络编程
- IPAddress IP地址类
- WebClient类
- WebRequest类和WebResponse类
- WebBrowser网页浏览器控件
- TCP网络编程
- TcpClient类
- TcpListener类
- NetworkStream类
- Socket类
HTTP网络编程
IPAddress IP地址类
IPAddress类代表IP地址,可在十进制表示法和实际的整数地址之间进行转换。IPHostEntry类封装了与主机相关的信息。Dns类可以检索IP地址和获取主机名。
域名解析示例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace NetWorkDemo
{
public partial class FormDNS : Form
{
public FormDNS()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IPHostEntry host = Dns.Resolve(textBox1.Text);
foreach (IPAddress addr in host.AddressList)
{
long ip = addr.Address;
listBox1.Items.Add(addr.ToString());
listBox1.Items.Add(ip.ToString());
}
textBox2.Text = host.HostName;
textBox3.Text = IPAddress.Broadcast.ToString();
}
}
}
WebClient类
WebClient类提供用于将数据发送到由URI标识的资源及从这样的资源接收数据的常用方法。
WebClient类常用方法:
名称 | 说明 |
---|---|
DownloadString | 以字符串形式下载位于指定URI的资源 |
OpenRead | 打开流向指定资源的可读流 |
OpenWrite | 打开一个流,以将数据写入指定的资源。这些方法不会阻止调用线程 |
UploadString | 将指定的字符串上载到指定的资源。这些方法不会阻止调用线程 |
WebClient类常用属性:
名称 | 说明 |
---|---|
IsBusy | 获取一个值,该值指示某一Web请求是否正在进行中 |
BaseAddress | 获取或设置WebClient发出请求的基URI |
WebRequest类和WebResponse类
WebClient类的使用比较简单,单功能有限,而且不能提供身份验证相关信息。如果使用某种特定协议,需要结合使用WebReques类和WebResponse类。WebRequest类用于发出对一个URI的请求,是抽象类。
WebResquest类主要方法:
名称 | 说明 |
---|---|
Create() | 创建对象 |
GetResponse() | 在子类中被重写时,返回对Internet请求的响应 |
GetRequestStream() | 在子类中被重写时,返回用于将数据写入Internet资源的Stream |
WebResquest类主要属性:
名称 | 说明 |
---|---|
ContentLength | 在子类中被重写时,获取或设置所发送的请求数据的内容长度 |
ContentType | 在子类中被重写时,获取或设置所发送的请求数据的内容类型 |
Credentials | 在子类中被重写时,获取或设置用于对Internet资源请求进行身份验证的网络凭证 |
Method | 在子类中被重写时,或取或设置要在此请求中使用的协议方法 |
RequestUri | 获取与请求关联的Internet资源的URI |
Headers | 在子类中被重写时,获取或设置与请求关联的表头名称/值对的集合 |
WebResponse类的主要成员:
名称 | 说明 |
---|---|
GetResponseStream | 在子类中被重写时,从Internet资源返回数据流 |
ContentLength | 在子类中被重写时,获取或设置所发送的请求数据的内容长度 |
ContentType | 在子类中被重写时,获取或设置所发送的请求数据的内容类型 |
Headers | 在子类被重写时,获取或设置与请求关联的标头名称/值对的集合 |
下载文件和获取Header信息示例:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NetWorkDemo
{
public partial class FormDownload : Form
{
public FormDownload()
{
InitializeComponent();
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
Stream s = client.OpenRead(textBox1.Text);
StreamReader reader = new StreamReader(s);
richTextBox1.Text = reader.ReadToEnd();
reader.Close();
s.Close();
}
/// <summary>
/// 获取Header头信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(textBox1.Text);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
NameValueCollection headers = res.Headers;
foreach (string name in headers)
{
listBox1.Items.Add(name + "------" + headers[name]);
}
}
}
}
WebBrowser网页浏览器控件
将WebBrowser控件拖拽到窗体上。设置网页地址即可浏览网页:
webBrowser1.Navigate(“www.baidu.com”, false);
TCP网络编程
System.Net.Sockets命名空间包含了一些相关类,允许直接发送TCP网络请求或者某个端口监听TCP网络请求。
System.Net.Sockets命名空间:
类:
名称 | 说明 |
---|---|
Socket | 实现套接字接口 |
SocketException | 发生套接字错误时引发的异常 |
TcpClient | 为TCP网络服务提供客户端连接 |
TcpListener | 从TCP网络客户端侦听连接 |
UdpClient | 提供用户数据协议(UDP)网络服务 |
枚举
名称 | 说明 |
---|---|
AddressFamily | 指定Socket类的实例可以使用的寻找方案 |
ProtocolFamily | 指定Socket类的实例可以使用的协议类型 |
PortocolType | 指定Socket类支持的协议 |
SocketFlags | 指定套接字的发送和接收行为 |
SocketOptionLevel | 为Socket.SetSocketOption和Socket.GetSocketOption方法定义套接字选项级别 |
TcpClient类
主要使用TcpClient类为TCP网络服务提供连接,包括相关属性和方法来控制连接,通过对流对象添加读写功能。
TcpClient类的主要方法:
名称 | 说明 |
---|---|
Connect | 使用指定的主机名和端口号将客户端连接到TCP主机 |
GetStream | 返回用于发送和接收数据的NetworkStream |
Close | 释放此TcpClient实例,而不关闭基础连接 |
TcpClient类的主要属性:
名称 | 说明 |
---|---|
Client | 获取或设置基础Socket |
SendTimeout | 发送操作超时时间 |
SendBufferSize | 获取或设置发送缓冲区的大小 |
ReceiveTimeout | 接收操作超时时间 |
ReceiveBufferSize | 获取或设置接收缓冲区的大小 |
TcpListener类
TcpListener类用于监听和接收连接请求,主要方法:
方法 | 说明 |
---|---|
Start | 开始侦听传入的连接请求 |
AcceptSocket | 接受挂起的连接请求 |
Stop | 关闭侦听器 |
NetworkStream类
传输数据时主要使用了NetworkStream类,它代表的是网络中传输的数据流,在发生会接收数据时,可从流中获取字节数据或对应的字符串。
NetworkStream类的主要方法:
名称 | 说明 |
---|---|
Read() | 从NetworkStream读取数据 |
ReadByte() | 从流中读取一个字节,并将流内的位置向前推进一个字节,已到达流的末尾,则返回-1 |
Write() | 将数据写入NetworkStream |
WriteByte() | 将一个字节写入流的当前位置,并将流内的位置向前推进一个字节 |
NetworkStream类的主要属性:
名称 | 说明 |
---|---|
Length | 获取流上可用数据的长度 |
Socket | 获取基础Socket |
服务端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NetWorkDemo
{
public partial class FormTCPRecv : Form
{
public FormTCPRecv()
{
InitializeComponent();
}
private TcpListener listen;
private NetworkStream netstream;
/// <summary>
/// 启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
listen = new TcpListener(9999);
listen.Start();
listBox1.Items.Add("服务器启动");
Socket socket = listen.AcceptSocket();
netstream = new NetworkStream(socket);
}
/// <summary>
/// 接收
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
if (netstream.DataAvailable)
{
byte[] getdata = new byte[1024];
int length = netstream.Read(getdata, 0, getdata.Length);
string msg = Encoding.Default.GetString(getdata, 0, length);
listBox1.Items.Add("收到客户端消息");
listBox1.Items.Add(msg);
}
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NetWorkDemo
{
public partial class FormTCPSender : Form
{
public FormTCPSender()
{
InitializeComponent();
}
private NetworkStream netstream;
private void button1_Click(object sender, EventArgs e)
{
TcpClient client = new TcpClient();
client.Connect("localhost", 9999);
netstream = client.GetStream();
if (textBox1.Text.Trim() == "")
{
MessageBox.Show("消息不能为空");
return;
}
else
{
byte[] senddata = Encoding.Default.GetBytes(textBox1.Text);
netstream.Write(senddata, 0, senddata.Length);
netstream.Flush();
}
netstream.Close();
}
}
}
Socket类
Socket实例包含了一个本地或者一个远程端点的套接字信息,Socket类的主要成员:
Socket类的主要方法:
名称 | 说明 |
---|---|
Connect | 建立与远程主机的连接 |
Close | 关闭Scket连接并释放所有关联的资源 |
Listen | 将Socket置于侦听状态 |
Receive | 接收来自绑定的Socket的数据 |
Send | 将数据发送到连接的Socket |
Socket类的主要属性:
名称 | 说明 |
---|---|
AddressFamily | 获取Socket的地址族 |
Available | 获取已经从网络接收且可供读取的数据量 |
Connected | 获取一个值,该值表明套接字是否与最后完成发送或接收操作的远程设备得到连接 |
ProtocolType | 获取Socket的协议类型 |
RemoteEndPoint | 获取远程端点 |
SendTimeout | 发送超时时间 |
SocketType | 获取Socket的类型 |
ReceiveBufferedSize | 获取或设置Socket接收缓冲区的大小 |
Socket类的构造函数:
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);