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

目录

一、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)再开启客户端接听

 

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

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

相关文章

【risc-v】易灵思efinix FPGA riscv嵌入式软件源码分享

系列文章目录 分享一些fpga内使用riscv软核的经验&#xff0c;共大家参考。后续内容比较多&#xff0c;会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 【risc-v】易灵思efinix FPGA sap…

Python高效编程:十招实用技巧大揭秘!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 1. 代码优化与高效数据结构 Python中使用合适的数据结构对于代码性能至关重要。例如&#xff0c;使用字典&#xff08;dict&#xff09;快速查找元素&#xff1a; # 使用字典进行快速查找 sample_dict {a: 1,…

springboot引用插件jhipster的yml配置跨域问题

yml文件配置&#xff0c;下面这下有问题 jhipster:cors:allowed-origins: http://localhost:8091,http://localhost,http://172.16.67.161:7171,http://116.204.122.21:9670,http://172.16.15.55:6600,http://localhost:9000allow-credentials: trueallowed-methods默认值只有…

Unity 关于SetParent方法的使用情况

在设置子物体的父物体时&#xff0c;我们使用SetParent再常见不过了。 但是通常我们只是使用其中一个语法&#xff1a; public void SetParent(Transform parent);使用改方法子对象会保持原来位置&#xff0c;跟使用以下方法效果一样&#xff1a; public Transform tran; ga…

关于铝镓氮(AlGaN)上p-GaN的高选择性、低损伤蚀刻

引言 GaN基高电子迁移率晶体管&#xff08;HEMT&#xff09;由于其高频和低导通电阻的特性&#xff0c;近来在功率开关应用中引起了广泛关注。二维电子气&#xff08;2DEG&#xff09;是由AlGaN/GaN异质结中强烈的自发和压电极化效应引起的&#xff0c;这导致传统器件通常处于…

HarmonyOS引入其他包,以引入请求axios为例

安装文件 安装文件位置: 总目录的oh-package.json5文件 dependencies&#xff1a;生产环境–上线运行时候必须需要的包 devDependencies&#xff1a;开发环境–开发适合为了方便提高效率的包。 包管理工具 OHPM CLI 作为鸿蒙生态三方库的包管理工具&#xff0c;支持OpenHar…

OpenLayers入门,OpenLayers的Popup弹出框如何内嵌Vue组件内容和内嵌iframe网页,根据所点击要素动态切换弹框内容

专栏目录: OpenLayers入门教程汇总目录 前言 本章主要讲解OpenLayers弹出框如何与VUE组件联动,在Popup弹出框内容中嵌入vue的组件,以及iframe第三方网页和html元素等内容。 本章支持根据所点击要素动态切换弹框内容。 二、依赖和使用 "ol": "^6.15.1&qu…

VMware安装Ubuntu系统(Server端,Desktop端步骤一样)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

接口压测指南

接口压测指南 一、 为什么需要进行接口压测二 、接口压测的目标是什么三、 用什么工具进行接口压测四、 接口压测核心指标4.1 JMeter的报告模板4.2 ApiPost报告模板 五、 接口慢如何排查5.1 大体排查思路5.2 排查工具5.3 压测经验 一、 为什么需要进行接口压测 突然有一天领导…

公司来了个00后,我愿称之为王中王,让人崩溃

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招就要开始了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&a…

git 本地改动无法删除

1. 问题 记录下git遇到奇怪的问题&#xff0c;本地有些改动不知道什么原因无法删除 git stash&#xff0c; git reset --hard HEAD 等都无法生效&#xff0c;最终通过强制拉取线上解决 如下图&#xff1a; 2. 解决 git fetch --all git reset --hard origin/master执行这两…

JavaSE基础50题:9. 求1~100内的所有素数

【概述】 素数&#xff1a;只能被1和自己整除。 素数的判断方法&#xff1a; 我们把非素数都写成 ab 的形式&#xff0c;如&#xff1a; 16 116 16 28 24 124 24 212 24 38 24 46 同样&#xff0c;我们发现&#xff0c;a 和 b 其中一定会有一个数字 < 根号n&#xff0…

华为交换机,配置攻击防范示例

攻击防范简介 定义 攻击防范是一种重要的网络安全特性。它通过分析上送CPU处理的报文的内容和行为&#xff0c;判断报文是否具有攻击特性&#xff0c;并配置对具有攻击特性的报文执行一定的防范措施。 攻击防范主要分为畸形报文攻击防范、分片报文攻击防范和泛洪攻击防范。 …

​LeetCode解法汇总1038. 从二叉搜索树到更大和树

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给定一个二…

Mybatis中的设计模式

Mybatis中的设计模式 Mybatis中使用了大量的设计模式。 以下列举一些看源码时&#xff0c;觉得还不错的用法&#xff1a; 创建型模式 工厂方法模式 DataSourceFactory 通过不同的子类工厂&#xff0c;实例化不同的DataSource TransactionFactory 通过不同的工厂&#xff…

餐饮行业想要做好软文推广的三大技巧,媒介盒子分享

数字化时代的来临&#xff0c;使越来越多的餐饮品牌和从业者利用软文推广来展示自己的产品、服务和品牌形象。而餐饮行业想要做好软文推广&#xff0c;并不是一味输出内容就行&#xff0c;今天媒介盒子就来和大家分享餐饮行业想要做好软文推广的三大技巧。 一、 软文推广作用 …

力扣124. 二叉树中的最大路径和(java DFS解法)

Problem: 124. 二叉树中的最大路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经…

95基于matlab的多目标优化算法NSGA3

基于matlab的多目标优化算法NSGA3&#xff0c;动态输出优化过程&#xff0c;得到最终的多目标优化结果。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 95matlab多目标优化 (xiaohongshu.com)

ODN光纤链路全程衰减如何计算

在FTTH等宽带光纤接入工程设计中&#xff0c;需根据应用系统的相应波长计算ODN光纤链路的全程衰减&#xff0c;一方面验证是否满足系统的光功率预算指标要求&#xff0c;另一方面作为工程验收的参考指标。 1 计算方法 ODN光纤链路的全程衰减是指从OLT至ONU的光纤链路中&#xf…

一个Blazor+WinForm+MAUI+PDA实现的条码比对系统

条码比对系统是由单机版桌面软件和Android版的PDA扫码软件组成&#xff0c;桌面软件采用Blazor与WinForm进行混合开发&#xff0c;PDA扫码软件采用MAUI进行开发&#xff0c;这个项目都是基于.NET技术进行构建&#xff0c;这也是将近期学习Blazor和MAUI这两门技术应用到实践当中…