.NET MAUI进行UDP通信

devtools/2025/1/18 13:55:19/

.NET MAUI是一个开源的跨平台框架库。NET,使创建丰富、现代的用户界面变得容易,.NET MAUI提供了一个多平台应用程序UI。我们可以使用.NET MAUI,用于使用C#和XAML创建本地移动和桌面应用程序。它还支持XAML热重载,这意味着我们可以在运行时编辑代码。NET MAUI应用程序可以在任何机器上运行,如windows或android模拟器。

打开Visual Studio
打开visual studio并单击“创建新项目”按钮。接下来,在搜索栏中,搜索.NET MAUI
在这里插入图片描述
接着一直点击下一步即可,直到创建项目。

1、添加新的page页:MinePage.xaml 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:vm ="clr-namespace:MauiAppDemo.VM"x:Class="MauiAppDemo.Page.Mine"Title="Mine"><ContentPage.BindingContext><vm:UdpViewModel /> //绑定上下文内容</ContentPage.BindingContext><VerticalStackLayout ><Label Text="Welcome to .NET MAUI!"VerticalOptions="Center" HorizontalOptions="Center" /><Label Text="接收到的消息:" FontSize="20" /><ScrollView x:Name="MessageScrollView"HeightRequest="100" VerticalScrollBarVisibility="Default"><Label x:Name="ReceivedMessageLabel" Text="{Binding ReceivedMessage}" FontSize="18" TextColor="Red" LineBreakMode="WordWrap" /></ScrollView><Entry x:Name="MessageEntry" Placeholder="Enter message to send" /><Button Text="Start Sending"WidthRequest="200" Margin="10,20,10,0" HorizontalOptions="Center"Style="{StaticResource Button}"Clicked="OnStartSendingClicked" /><Button Text="Stop Sending" WidthRequest="200" Margin="10,20,10,0" HorizontalOptions="Center"Style="{StaticResource Button}"Clicked="OnStopSendingClicked" /><Button Text="连接"WidthRequest="200" Margin="10,20,10,0" x:Name="connectBtn"IsVisible="False"HorizontalOptions="Center"Style="{StaticResource Button}"Clicked="connectBtn_Clicked"></Button><Button Text="Reback"WidthRequest="200" Margin="10,20,10,0" x:Name="backBtn"HorizontalOptions="Center"Style="{StaticResource Button}"Clicked="backBtn_Clicked"></Button></VerticalStackLayout>
</ContentPage>

2、文件中使用了 VM,故添加 UdpViewModel.cs 文件如下所示:

using MauiAppDemo.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;namespace MauiAppDemo.VM
{/// <summary>/// udp消息接收类/// </summary>public class UdpViewModel : INotifyPropertyChanged{private string _receivedMessage=string.Empty;public string ReceivedMessage{get => _receivedMessage;set{if (_receivedMessage != value){_receivedMessage = value;OnPropertyChanged();}}}private Timer _timer;private readonly string _targetIp = "10.10.100.100";private readonly int _targetPort = 8899;//开始发送信息public void StartSending(string message, double intervalMs){StopSending(); // 确保只有一个定时器运行_timer = new Timer(async _ =>{await UDPHelper.Instance.SendMessageAsync(message, _targetIp, _targetPort);}, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(intervalMs));}public void StopSending(){_timer?.Dispose();_timer = null;}
//开始接收信息public void StartReceiving(){Task.Run(async () =>{while (true){string receivedMessage = await UDPHelper.Instance.ReceiveMessageAsync();if (!string.IsNullOrEmpty(receivedMessage)){MainThread.BeginInvokeOnMainThread(() =>{ReceivedMessage += receivedMessage;});}}});}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string? propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}
}

3、添加UDP帮助类:UDPHelper.cs 如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace MauiAppDemo.Common
{/// <summary>/// udp帮助类/// </summary>public class UDPHelper{private static readonly Lazy<UDPHelper> _instance = new(() => new UDPHelper());private static readonly object _lock = new(); // 用于线程安全的锁private UdpClient _udpClient;private CancellationTokenSource _cancellationTokenSource;private int _port;// 单例模式,构造函数设为私有private UDPHelper(){// 初始化 UdpClient,不绑定端口以支持发送_udpClient = new UdpClient();}// 获取单例实例public static UDPHelper Instance => _instance.Value;// 设置监听端口public void Initialize(int port){lock (_lock){_port = port;// 关闭之前的客户端(如果存在),并重新初始化_udpClient?.Close();_udpClient = new UdpClient(_port);}}// 发送消息(线程安全)public async Task SendMessageAsync(string message, string ipAddress, int port){byte[] data = Encoding.UTF8.GetBytes(message);await _udpClient.SendAsync(data, data.Length, ipAddress, port);}// 接收消息(线程安全)public async Task<string> ReceiveMessageAsync(){try{var result = await _udpClient.ReceiveAsync();return Encoding.UTF8.GetString(result.Buffer);}catch (Exception ex){// 打印错误日志以检查问题Console.WriteLine($"接收消息时出错: {ex.Message}");return string.Empty;}}public void StopReceiving(){_cancellationTokenSource?.Cancel();_udpClient?.Close();_udpClient = null;}}
}

4、主界面添加跳转按钮

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MauiAppDemo.MainPage"><ScrollView><VerticalStackLayoutPadding="30,0"Spacing="25"><ImageSource="dotnet_bot.png"HeightRequest="185"Aspect="AspectFit"SemanticProperties.Description="dot net bot in a race car number eight" /><LabelText="Hello, World!"Style="{StaticResource Headline}"SemanticProperties.HeadingLevel="Level1" /><LabelText="Welcome to &#10;.NET Multi-platform App UI"Style="{StaticResource SubHeadline}"SemanticProperties.HeadingLevel="Level2"SemanticProperties.Description="Welcome to dot net Multi platform App U I" /><Buttonx:Name="CounterBtn"Text="Click me" SemanticProperties.Hint="Counts the number of times you click"Clicked="OnCounterClicked"HorizontalOptions="Fill" /><Button x:Name="navigateBtn"Text="Goto another page" SemanticProperties.Hint="goto another page when you click"Clicked="navigateBtn_Clicked"HorizontalOptions="Fill" /></VerticalStackLayout></ScrollView></ContentPage>

5、主界面后台代码

  private async void navigateBtn_Clicked(object sender, EventArgs e){await Navigation.PushAsync(new Mine()); // 跳转到 Mine界面}

至此就实现了一个UDP通信的demo,添加定时器发送是因为我的版本程序需要收到信息才回复一个对应的信息。

6、程序调试效果如下:
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/devtools/151575.html

相关文章

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…

使用 ChatGPT 生成和改进你的论文

文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具&#xff0c;可以帮助你…

QT开发技术 【基于TinyXml2的对类进行序列化和反序列化】 二

一、对上一篇进行优化和进一步完善 二、增加序列化器类 需要序列化的类继承该类进行操作 class CXmlSerializer { public:CXmlSerializer() default;virtual ~CXmlSerializer() default;bool Serialize(std::string& strXml);bool Deserialize(const std::string&…

如何攻击一个服务器(仅用于教育及娱乐实验目的)

import socket import osdef create_virus():# 创建一个简单的病毒脚本&#xff0c;它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…

从入门到深入:Spring 框架全解析

Spring 的核心模块 Spring 框架由多个模块组成&#xff0c;每个模块提供特定的功能。这些模块可以单独使用&#xff0c;也可以组合在一起满足各种应用场景。 Spring Core Spring Core 模块是框架的核心&#xff0c;支持依赖注入和 IOC&#xff08;Inversion of Control&#x…

HTTP 到 HTTPS – 以下是操作步骤

将网站从HTTP升级到HTTPS&#xff0c;是保障用户信息安全的必要步骤。通过以下方式&#xff0c;您可以轻松保护您的网站和业务。 为什么需要将网站从HTTP升级到HTTPS&#xff1f; 信息加密 在您访问网站的过程中&#xff0c;数据会经过很多中转站&#xff0c;才能最终到达目标…

PLC(电力载波通信)网络机制介绍

1. 概述 1.1 什么是PLC 电力载波通讯即PLC&#xff0c;是英文Power line Carrier的简称。 电力载波是电力系统特有的通信方式&#xff0c;电力载波通讯是指利用现有电力线&#xff0c;通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重新架设网络&#xf…

工业网口相机:如何通过调整网口参数设置,优化图像传输和网络性能,达到最大帧率

项目场景 工业相机是常用与工业视觉领域的常用专业视觉核心部件&#xff0c;拥有多种属性&#xff0c;是机器视觉系统中的核心部件&#xff0c;具有不可替代的重要功能。 工业相机已经被广泛应用于工业生产线在线检测、智能交通,机器视觉,科研,军事科学,航天航空等众多领域 …