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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的PyGame的俄罗斯方块游戏设计与实现

摘 要 近年来&#xff0c;随着游戏产业的突飞猛进&#xff0c;游戏玩家的技术也是与日俱增&#xff0c;当你看见游戏高手完美的表演时&#xff0c;你是否想过我也能达到那种水平&#xff0c;本程序用Python语言编写俄罗斯方块&#xff0c;左侧显示正在运行的游戏&#xff0c;右…

BFS求树的宽度——结合数组建树思想算距离

二叉树最大宽度 https://leetcode.cn/problems/maximum-width-of-binary-tree/description/ 1、考虑树的宽度一定是在一层上的所以进行BFS&#xff0c;树的BFS不建议直接使用队列&#xff0c;每次add/offer然后poll/remove&#xff0c;这样子层级关系不好显示。我们可以定义…

MySQL笔记-第05章_排序与分页

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第05章_排序与分页1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 第05章_排序与分页 讲师&#…

Apache Sqoop使用

1. Sqoop介绍 Apache Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。 Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。 Hadoop 生态系统包括&#xff1a;HDFS、Hi…

Ubuntu20.04安装向日葵、开机自启、解决windows系统远程黑屏(笔记)

这里写目录标题 动机1. Ubuntu20.04 安装向日葵2. 设置开机自启3. 解决windows不可远程的问题4. 大公告成 动机 办公室有个工作站&#xff0c;要比我的笔记本的CPU稍微好一点&#xff0c;用来跑陆面过程。我信心满满的装了个Ubuntu20.04双系统,但是发现向日葵安装不上了。我少…

从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位 置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

题目描述&#xff1a;从顺序表中删除具有最小值的元素(假设唯一) 并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 bool DeleteMin(SqList &L,int &min){if(L.length 0)return false;min L…

回溯和分支算法

状态空间图 “图”——状态空间图 例子&#xff1a;农夫过河问题——“图”状态操作例子&#xff1a;n后问题、0-1背包问题、货郎问题(TSP) 用向量表示解&#xff0c;“图”由解向量扩张得到的解空间树。 ——三种图&#xff1a;n叉树、子集树、排序树 ​ 剪枝 不满住条件的…

时间序列数据压缩算法简述

本文简单介绍了时间序列压缩任务的来源&#xff0c;压缩算法的分类&#xff0c;并对常见压缩算法的优缺点进行了简介&#xff0c;爱码士们快来一探究竟呀&#xff01; 引言 时间序列数据是在许多应用程序和领域中生成的一种基本数据类型&#xff0c;例如金融、医疗保健、交通和…

基于Python手把手教你实现flappy bird游戏

目录 前言开始前的准备工作进入正题结束语 前言 想必玩过游戏的都知道&#xff0c;Flappy Bird是一款简单却富有挑战性的经典的小鸟飞行游戏&#xff0c;让许多玩家为之痴迷&#xff0c;而作为开发者&#xff0c;那肯定要通过技术手段来再做一遍这款经典游戏。那么本文就来通…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…

SQL基础理论篇(十):事务处理

文章目录 简介事务的四大特性ACID如何使用事务参考文献 简介 MySQL在5.5版本之前&#xff0c;默认的存储引擎是MyISAM&#xff0c;它是不支持事务的&#xff0c;而5.5版本之后默认的引擎是InnoDB&#xff0c;这个是支持事务的&#xff0c;这也是InnoDB最终取代MyISAM称为主流引…

vscode配置使用 cpplint

标题安装clang-format和cpplint sudo apt-get install clang-format sudo pip3 install cpplint标题以下settings.json文件放置xxx/Code/User目录 settings.json {"sync.forceDownload": false,"workbench.sideBar.location": "right","…

振动和震动的区别?

问题描述&#xff1a;振动和震动的区别&#xff1f; 问题解决&#xff1a; 震动&#xff08;Oscillation&#xff09;&#xff1a; 特点&#xff1a; 随机的、突发的、不经常的、无规律的运动。例子&#xff1a; 地壳震动、消息震动全国&#xff0c;强调的是运动的力度或幅度&…

Using Application Engine Meta-SQL 使用应用引擎元SQL

Using Application Engine Meta-SQL 使用应用引擎元SQL This section describes the meta-SQL constructs, functions, and meta-variables you can use in Application Engine. 本节描述可以在Application Engine中使用的元SQL构造、函数和元变量。 Note: The SQL Editor does…

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…

分类变量组间差异分析

1&#xff0c;频数表列联表 一维频数表 table <- table(data$low) table 0 1 130 59 prop.table(table)#百分比0 1 0.6878307 0.3121693 二维频数表 table1 <- table(data$low,data$smoke) table10 1 0 86 44 1 29 30 addmargins(table1)0 1 Sum 0…

2023.12.3 每日一题 最大点数 很巧秒的做法,数学思维的开拓

1423. 可获得的最大点数 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你…

java synchronized详解

背景 在多线程环境下同时访问共享资源会出现一些数据问题&#xff0c;此关键字就是用来保证线程安全的解决这一问题。 内存可见的问题 在了解synchronized之前先了解一下java内存模型&#xff0c;如下图&#xff1a; 线程1去主内存获取x的值读入本地内存此时x的值为1&…

React笔记

React 目录结构 入口文件 React是 React 的核心库 ReactDom是提供与 DOM 相关的功能 RegisterServiceWorker加快react的运行速度的一个js文件 ReactDom.render() 渲染页面 React创建组件 render里边放的模板 是HTML和JavaScript的结合 jsx 创建子组件 App.js 根组件文件…

3DMM模型

目录 BFMBFM_200901_MorphableModel.matexp_pca.bintopology_info.npyexp_info.npy BFM BFM_2009 01_MorphableModel.mat from scipy.io import loadmat original_BFM loadmat("01_MorphableModel.mat") # dict_keys: [__header__, __version__, __globals__, # …