C#网络编程UDP程序设计(UdpClient类)

news/2024/5/18 13:39:01 标签: 网络, c#, udp

目录

一、UdpClient类 

二、示例

1.源码

(1)Client

(2)Server

2.生成

(1)先启动服务器,发送广播信息

(2)再开启客户端接听


       UDP是user datagram protocol的简称,中文名是用户数据报协议,它是网络信息传输的另一种形式。UDP通信和TCP通信不同,基于UDP的信息传递更快,但不提供可靠的保证。使用UDP传递数据时,用户无法知道数据能否正确地到达主机,也不能确定到达目的地的顺序是否和发送的顺序相同。

        虽然UDP是一种不可靠的协议,但如果需要较快地传输信息,并能容忍小的错误,可以考虑使用UDP。基于UDP通信的基本模式如下

  • 将数据打包(称为数据包),然后将数据包发往目的地。
  • 接收别人发来的数据包,然后查看数据包。

        在C#中,UdpClient类用于在阻止同步模式下发送和接收无连接UDP数据报。因为UDP是无连传输协议,所以不需要在发送和接收数据前建立远程主机连接,但可以选择使用下面两种方法之一建立默认远程主机。

  • 使用远程主机名和端口号作为参数创建UdpClient类的实例。
  • 创建UdpClient类的实例,然后调用Connect方法。   

一、UdpClient类 

        UdpClient类的常用属性、方法及说明如表:

属性及方法说明
Available属性获取从网络接收的可读取的数据量
Client属性获取或设置基础网络Socket
BeginReceive方法从远程主机异步接收数据报
BeginSend方法将数据报异步发送到远程主机
Close方法关闭UDP连接
Connect方法建立默认远程主机
EndReceive方法结束挂起的异步接收
EndSend方法结束挂起的异步发送
Receive方法返回已由远程主机发送的UDP数据报
Send方法将UDP数据报发送到远程主机
EnableBroadcast属性是否接收或发送广播
Active属性获取或者设置一个值指示是否已建立默认远程主机
JoinMulticastGroup方法将UdpClient添加到多路广播组
DropMulticastGroup方法将UdpClient退出多路广播组

二、示例

        本实例要求主机不断地重复播出节目预报,这样可以保证加入到同一组的主机随时接收到广播信 。接收者将正在接收的信息放在一个文本框中,并将接收的全部信息放在另一个文本框中。

1.源码

(1)Client

// Client
// 创建接收广播项目Clent(Windows窗体应用程序),
// 单击“开始接收”按钮,系统开始接收主机播出的信息;
// 单击“停止接收”按钮,系统会停止接收广播主机播出的信息。
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace Client
{
    public partial class Form1 : Form
    {
        private Button? button1;
        private Button? button2;
        private TextBox? textBox1;
        private TextBox? textBox2;

        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1_Load);
            CheckForIllegalCrossThreadCalls = false;    //在其他线程中可以调用主窗体控件
        }

        private CancellationTokenSource? cancellationToken1;
        private bool flag = true; //定义一个bool变量,标识是否接收数据
        private UdpClient? udp;   //创建UdpClient对象
        private Thread? thread;   //创建线程对象

        private void Form1_Load(object? sender, EventArgs e)
        {
            // 
            // button1
            // 
            button1 = new Button
            {
                BackColor = Color.Red,
                FlatStyle = FlatStyle.Flat,
                Font = new Font("宋体", 10F, FontStyle.Bold, GraphicsUnit.Point, 134),
                Location = new Point(228, 5),
                Name = "button1",
                Size = new Size(85, 32),
                TabIndex = 0,
                Text = "开始接收",
                UseVisualStyleBackColor = false
            };
            button1.FlatAppearance.BorderSize = 0;
            button1.Click += new EventHandler(Button1_Click);
            // 
            // button2
            // 
            button2 = new Button
            {
                BackColor = Color.Yellow,
                FlatStyle = FlatStyle.Flat,
                Font = new Font("宋体", 10F, FontStyle.Bold, GraphicsUnit.Point, 134),
                Location = new Point(319, 5),
                Name = "button2",
                Size = new Size(85, 32),
                TabIndex = 1,
                Text = "停止接收",
                UseVisualStyleBackColor = false
            };
            button2.FlatAppearance.BorderSize = 0;
            button2.Click += new EventHandler(Button2_Click);
            // 
            // textBox1
            // 
            textBox1 = new TextBox
            {
                Location = new Point(7, 54),
                Multiline = true,
                Name = "textBox1",
                ScrollBars = ScrollBars.Both,
                Size = new Size(311, 133),
                TabIndex = 2
            };
            // 
            // textBox2
            // 
            textBox2 = new TextBox
            {
                ForeColor = Color.Blue,
                Location = new Point(319, 54),
                Multiline = true,
                Name = "textBox2",
                ScrollBars = ScrollBars.Both,
                Size = new Size(306, 133),
                TabIndex = 3
            };
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(6F, 12F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(638, 193);
            Controls.Add(textBox2);
            Controls.Add(textBox1);
            Controls.Add(button2);
            Controls.Add(button1);
            Name = "Form1";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Client";
            
        }

        private void Button1_Click(object? sender, EventArgs e)
        {
            udp = new UdpClient(888);
            flag = true;         
            IPEndPoint ipendpoint = new(IPAddress.Any, 888);     //创建IPEndPoint对象,用来显示响应主机的标识
            thread = new Thread(() =>                            //新开线程,执行接收数据操作
            {
                while (flag)
                {
                    try
                    {
                        if (udp.Available <= 0) continue;         //判断是否有网络数据
                        if (udp.Client == null) return;           //判断连接是否为空                       
                        byte[] bytes = udp.Receive(ref ipendpoint);    //调用UdpClient对象的Receive方法获得从远程主机返回的UDP数据报                       
                        string str = Encoding.Default.GetString(bytes);//将获得的UDP数据报转换为字符串形式
                        textBox1!.Text = "正在接收的信息:\n" + str;    //显示正在接收的数据
                        textBox2!.Text += "\n" + str;                  //显示接收的所有数据
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);//错误提示
                    }
                    Thread.Sleep(1000);             //线程休眠1秒
                }
            });
            thread.Start();                         //启动线程
        }

        private void Button2_Click(object? sender, EventArgs e)
        {
            cancellationToken1 = new CancellationTokenSource();
            flag = false;  //不接收数据
            if (thread!.ThreadState == ThreadState.Running) //判断线程是否运行
                cancellationToken1.Cancel();                //关闭线程
            udp!.Close();  //关闭连接
        }
       
    }
}

(2)Server

// Server,先开Server后开Client
// 广播数据报程序
// 创建广播主机项目Server(控制台应用程序),在Main()方法中创建UDP连接;
// 然后通过UDP 不断向外发送广播信息。
using System.Text;
using System.Net.Sockets;

namespace Server
{
    class Program
    {
        static readonly UdpClient udp = new();// 创建UdpClient对象
        static void Main(string[] args)
        {          
            udp.Connect("127.0.0.1", 888);    //调用UdpClient对象的Connect方法建立默认远程主机
            while (true)
            {
                Thread thread = new(() =>
                {
                    try
                    {
                        string str = "(" + DateTime.Now.ToLongTimeString();
                        str += ")节目预报:八点有大型晚会,请收听"; 
                        
                        byte[] sendBytes = Encoding.Default.GetBytes(str); //定义一个字节数组,用来存放发送到远程主机的信息
                        Console.WriteLine(str);                       
                        udp.Send(sendBytes, sendBytes.Length);             //调用UdpClient对象的Send方法将UDP数据报发送到远程主机
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                });
                thread.Start();         //启动线程
                Thread.Sleep(1000);//线程休眠1秒
            }
        }
    }
}

2.生成

(1)先启动服务器,发送广播信息

 

(2)再开启客户端接听

 


http://www.niftyadmin.cn/n/5238284.html

相关文章

Linux中项目部署步骤

安装jdk&#xff0c;tomcat 安装步骤 1&#xff0c;将压缩包&#xff0c;拷贝到虚拟机中。 通过工具&#xff0c;将文件直接拖到虚拟机的/home下 2&#xff0c;回到虚拟机中&#xff0c;查看/home下&#xff0c;有两个压缩文件 3&#xff0c;给压缩文件做解压缩操作 tar -z…

机器学习之——诈骗号码识别

研究目的 根据用户的app使用情况&#xff0c;用户的流量使用情况&#xff0c;用户通话记录&#xff0c;用户的短信记录&#xff0c;判定用户号码是否是诈骗号码。数据集 train&#xff1a; train_app.csv&#xff1a;app使用情况 . train_user.csv&#xff1a;基本信息 . train…

【DevOps】Jenkins:配置jenkins 流水线/多分支流水线任务构建成功通知企业微信@相关人(二)

目录 一、调用Kubernetes API二、打包编译三、应用于流水线上一篇文章实现了企业微信通知,但仅仅是Jenkins构建后通知,如果在K8s侧配置了就绪检测和滚动更新,那构建完成并不能代表服务已经发布完成,本篇文章我们就来解决这个问题 一、调用Kubernetes API 我这里使用Golan…

uniapp搭建内网映射测试https域名

搭建Https域名服务器 使用github的frp搭建&#xff0c;使用宝塔申请免费https证书&#xff0c;需要先关闭宝塔nginx的反向代理&#xff0c;申请完域名后再开启反向代理即可。 教程 新版frp搭建教程 启动命令 服务器端 sudo systemctl start frps本地 cd D:\软件安装包\f…

求二维数组周边元素的累加和

求一个二维数组周边元素的累加和。 输入一个二维数组的行数m&#xff08;m<10&#xff09;&#xff0c;列数n(n<10)&#xff0c;二维数组的各元素值。输出周边元素之和。 输入格式: 输入的第一行为矩阵的行数和列数&#xff0c;从第二行开始&#xff0c;为矩阵元素的输…

人工智能学习7(决策树算法)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm 决策树算法信息熵信息熵例题计算&#xff1a; 信息增益&#xff08;决策树划分依据之一ID3&#xff09;信息增益例题计算&#xff1a; 信息增益率(决策树划分依据之一C4.5)基尼值和基尼指数(决策树划分依据之…

鸿蒙开发:UIAbility组件间交互探索实战【鸿蒙专栏-22】

UIAbility组件间交互(设备内) 在设备内,UIAbility(用户界面能力)是系统调度的最小单元,它们负责展示用户界面和执行相关的业务逻辑。设备内的不同功能模块之间的交互是应用程序开发中的重要部分。本文将探讨设备内UIAbility之间的交互方式,包括启动应用内的UIAbility、…

《微信小程序开发从入门到实战》学习四十一

4.2 云开发JSON数据库 4.2.12 更新指令 update方法除了用指定值更新字段外&#xff0c;数据库API还提供了更新指令执行更复杂的 更新的操作&#xff0c;更新指令被封装在db.command对象中的函数。如下表所示&#xff1a; set 设置字段为指定值 remove 删除字…