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

网络编程

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/103194.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产开发板上打造开源ThingsBoard工业网关--基于米尔芯驰MYD-JD9X开发板

本篇测评由面包板论坛的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-JD9X开发板打造成开源的Thingsboard网关。 Thingsboard网关是一个开源的软件网关&#xff0c;采用python作为开发语言&#xff0c;可以部署在任何支持 python 运行环境的主机上&#xff0c;灵…

Java IDEA controller导出CSV,excel

Java IDEA controller导出CSV&#xff0c;excel 导出excel/csv&#xff0c;亲测可共用一个方法&#xff0c;代码逻辑里判断设置不同的表头及contentType&#xff1b;导出excel导出csv 优化&#xff1a;有数据时才可以导出参考 导出excel/csv&#xff0c;亲测可共用一个方法&…

Rust所有权

文章目录 什么是所有权Stack vs Heap所有权规则变量作用域String类型内存与分配所有权与函数 引用与借用可变引用悬垂引用引用的规则 切片字符串切片其他类型的切片 什么是所有权 什么是所有权 所有程序在运行时都必须管理其使用计算机内存的方式&#xff1a; 一些语言中具有垃…

Go 包操作之如何拉取私有的Go Module

Go 包操作之如何拉取私有的Go Module 在前面&#xff0c;我们已经了解了GO 项目依赖包管理与Go Module常规操作&#xff0c;Go Module 构建模式已经成为了 Go 语言的依赖管理与构建的标准。 在平时使用Go Module 时候&#xff0c;可能会遇到以下问题&#xff1a; 在某 modul…

如何使用 PostgreSQL 进行数据迁移和整合?

​ PostgreSQL 是一个强大的开源关系型数据库管理系统&#xff0c;它提供了丰富的功能和灵活性&#xff0c;使其成为许多企业和开发者的首选数据库之一。在开发过程中&#xff0c;经常会遇到需要将数据从一个数据库迁移到另一个数据库&#xff0c;或者整合多个数据源的情况。…

webGL编程指南 第四章 旋转+平移.TanslatedRotatdTriangle

我会持续更新关于wegl的编程指南中的代码。 当前的代码不会使用书中的缩写&#xff0c;每一步都是会展开写。希望能给后来学习的一些帮助 git代码地址 &#xff1a;git 本篇文章将把旋转和平位移结合起来&#xff0c;因为矩阵的不存在交换法则 文章中设计的矩阵地址在这里​…

Go 实现插入排序算法及优化

插入排序 插入排序是一种简单的排序算法&#xff0c;以数组为例&#xff0c;我们可以把数组看成是多个数组组成。插入排序的基本思想是往前面已排好序的数组中插入一个元素&#xff0c;组成一个新的数组&#xff0c;此数组依然有序。光看文字可能不理解&#xff0c;让我们看看…

【vue3】状态过渡-GSAP插件实现

效果图&#xff1a; 实现代码 安装库&#xff1a;npm install --save-dev gsap 引入&#xff1a;import gsap from gsap <template><div><el-input v-model"num.currNum" type"number" step"20" style"width: 120px;"…

算法训练 第四周

一、二分查找 本题给我们提供了一个有n个元素的升序整形数组nums和一个目标值target&#xff0c;要求我们找到target在nums数组中的位置&#xff0c;并返回下标&#xff0c;如果不存在目标值则返回-1。nums中的所有元素不重复&#xff0c;n将在[1&#xff0c;10000]之间&#x…

基于C/C++的UG二次开发流程

文章目录 基于C/C的UG二次开发流程1 环境搭建1.1 新建工程1.2 项目属性设置1.3 添加入口函数并生成dll文件1.4 执行程序1.5 ufsta入口1.5.1 创建程序部署目录结构1.5.2 创建菜单文件1.5.3 设置系统环境变量1.5.4 制作对话框1.5.5 创建代码1.5.6 部署和执行 基于C/C的UG二次开发…

基于MIMO+16QAM系统的VBLAST译码算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................................ for SNR_dBSNRS…

火山引擎 LAS Spark 升级:揭秘 Bucket 优化技术

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 文章介绍了 Bucket 优化技术及其在实际业务中的应用&#xff0c;包括 Spark Bucket 的基本原理&#xff0c;重点阐述了火山引擎湖仓一体分析服务 LAS&#xff08;下…

vue3 elementPlus 表格实现行列拖拽及列检索功能

1、安装vuedraggable npm i -S vuedraggablenext 2、完整代码 <template> <div classcontainer><div class"dragbox"><el-table row-key"id" :data"tableData" :border"true"><el-table-columnv-for"…

8.2 矢量图层点要素单一符号使用一

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染简单标记(Simple Marker)QGis代码实现 SVG标记&#xff08;SVG marker&#xff09;QGis代码实现 总结 前言 上一篇教程对矢量图层符号化做了一个整体介绍&#xff0c;并以点图层为例介绍了可以使用的渲染器&am…

【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建TabBar

SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 Xcode14 MacOS12.6 iPhone Simulator iPhone 14 Pro Max SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建Tab…

ubuntu安装golang

看版本&#xff1a;https://go.dev/dl/ 下载&#xff1a; wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz卸载已有的go&#xff0c;可以apt remove go&#xff0c;也可以which go之后删除那个go文件&#xff0c;然后&#xff1a; rm -rf /usr/local/go && tar…

在 Python 中使用 Pillow 进行图像处理【3/4】

第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg&#xff0c;您可以从本教程链接的存储库中下载该文件&#xff1a; 该二值图像的左侧显示黑色背景上的白点&#xff0c;而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用…

如何创建前端绘图和图表?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【excel技巧】excel单元格内如何换行?

Excel表格&#xff0c;在制作完成之后&#xff0c;在输入数据的时候&#xff0c;总是会遇到内容长度太长导致无法全部显示或者破坏表格整体格式。几天分享4个单元格换行的方法给大家。 方法一&#xff1a; 首先我们先介绍一个&#xff0c;通过调整列宽的方式来达到显示全部内…

使用Python的Flask框架开发验证码登录功能

目录 一、安装和配置Flask 二、生成验证码 三、处理用户输入和验证验证码 四、实现安全的用户认证 五、创建HTML模板 总结 验证码登录功能是现代Web应用程序中常见的安全特性之一&#xff0c;它有助于防止自动化机器人或恶意用户进行非法登录。在本文中&#xff0c;我们将…