C# Winform编程(9)网络编程

网络编程

HTTP网络编程

IPAddress IP地址类

IPAddress类代表IP地址,可在十进制表示法和实际的整数地址之间进行转换。IPHostEntry类封装了与主机相关的信息。Dns类可以检索IP地址和获取主机名。

域名解析示例:

csharp 复制代码
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信息示例:

csharp 复制代码
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

服务端:

csharp 复制代码
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);
            }
        }
    }
}

客户端:

csharp 复制代码
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);

相关推荐
sheng12345678rui1 小时前
电脑提示d3dcompiler_47.dll缺失怎么修复,仔细介绍dll的解决方法
游戏·3d·电脑·dll文件·dll修复工具·1024程序员节
程序员是干活的1 天前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
freellf9 天前
数据结构及基本算法
1024程序员节
BruceGerGer1 个月前
flutter开发实战-flutter web加载html及HtmlElementView的使用
flutter·1024程序员节
网络冒险家2 个月前
【软考】系统集成项目管理工程师【第二版】
职场和发展·软考·集成学习·1024程序员节·系统集成项目工程师
BruceGerGer2 个月前
flutter开发实战-AssetBundle读取指定packagename的文件
flutter·1024程序员节
sheng12345678rui2 个月前
最新缺失msvcp140.dll的多种解决方法,有效解决电脑dll问题
windows·microsoft·电脑·dll文件·1024程序员节
a5553338203 个月前
电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法
java·经验分享·dll·dll文件丢失·1024程序员节
行十万里人生3 个月前
C++ 智能指针
linux·c++·git·阿里云·容器·蓝桥杯·1024程序员节
a5553338203 个月前
启动鸣潮提示错误代码126:加载d3dcompiler_43.dll错误或缺失的7个解决方法
前端·经验分享·dll·dll文件丢失·1024程序员节