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


    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();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述

    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();
            }
    
            /// 
            /// 下载文件
            /// 
            /// 
            /// 
            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();
            }
    
            /// 
            /// 获取Header头信息
            /// 
            /// 
            /// 
            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]);
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    在这里插入图片描述

    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;
            /// 
            ///  启动
            /// 
            /// 
            /// 
            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);
            }
    
    
            /// 
            /// 接收
            /// 
            /// 
            /// 
            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);
                }
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    客户端:

    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();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    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);

  • 相关阅读:
    【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列
    最优化 | 一维搜索与方程求根 | C++实现
    PHP redis key
    【Web前端】一文带你吃透CSS(中篇)
    Wireshark数据包分析——时间盲注/延时注入攻击
    计算机网络:数据链路层
    马克·雷伯特访谈:机器人的未来及波士顿动力的创新之路
    React源码分析(三):useState,useReducer
    docker安装可视化Portainer界面
    Python 一网打尽<排序算法>之堆排序算法中的树
  • 原文地址:https://blog.csdn.net/u013420428/article/details/134014564