WPF使用TouchSocket实现Tcp client

文章目录

  • 前言
  • 1、页面展示
  • 2、主页面UI代码
  • 2、TCP client的UI代码
  • 3、Tcp client后台代码实现
  • 4、UI与后台代码的关联

前言

在该篇的Demo中,您可以找到以下内容:
1、TouchSocket的使用;
2、CommunityToolkit.Mvvm的使用;
3、AvalonDock可拖拽停靠控件的使用;
4、Visual Studio的Dark主题页面的实现;
5、MVVM框架开发使用;
6、RichTextBox控件的使用;

Demo下载地址: WPF Demo项目代码

1、页面展示

在这里插入图片描述

2、主页面UI代码

<Window x:Class="WPF_Demo_V2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPF_Demo_V2"mc:Ignorable="d"Background="#1F1F1F"MouseLeftButtonDown="Window_MouseLeftButtonDown"WindowStartupLocation="CenterScreen"WindowState="Normal"xmlns:avalon="https://github.com/Dirkster99/AvalonDock"Title="WPF Demo V0.0.1" Height="768" Width="1024" ><Window.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="./Resource/Dictionary/DarkStyle.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Window.Resources><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><!--<TextBlock Text="&#xe6ab;" FontFamily="./Resource/Font/#iconfont" TextAlignment="Center" Foreground="{DynamicResource Foreground}" FontSize="30" Background="{DynamicResource WindowBrush}"/>--><Menu Grid.Column="1" Background="{DynamicResource WindowBrush}" Foreground="{DynamicResource Foreground}" HorizontalAlignment="Left" VerticalAlignment="Top"><MenuItem Header="File" ><MenuItem Header="New"/><MenuItem Header="Open" /></MenuItem><MenuItem Header="Edit" ><MenuItem Header="Undo"/><MenuItem Header="Cut"/><MenuItem Header="Copy"/></MenuItem><MenuItem Header="View" ><MenuItem Header="Explorer"/><MenuItem Header="Open"/></MenuItem><MenuItem Header="Tool" ><MenuItem Header="Extentions"/><MenuItem Header="Options"/></MenuItem><MenuItem Header="Help" ><MenuItem Header="Welcome"/><MenuItem Header="Support"/><MenuItem Header="About"/></MenuItem></Menu></Grid><avalon:DockingManager Grid.Row="1"><avalon:DockingManager.Theme><avalon:Vs2013DarkTheme/></avalon:DockingManager.Theme><avalon:LayoutRoot><avalon:LayoutPanel Orientation="Horizontal"><avalon:LayoutAnchorablePaneGroup DockWidth="150" FloatingWidth="240"><avalon:LayoutAnchorablePane x:Name="panelLeft"><avalon:LayoutAnchorable Title="Tool"></avalon:LayoutAnchorable><avalon:LayoutAnchorable Title="Team"></avalon:LayoutAnchorable></avalon:LayoutAnchorablePane></avalon:LayoutAnchorablePaneGroup><avalon:LayoutPanel Orientation="Vertical"><avalon:LayoutDocumentPaneGroup><avalon:LayoutDocumentPane x:Name="panelTop"><avalon:LayoutDocument Title="TCP Server"><Frame Source="./View/TcpServerPage.xaml"/></avalon:LayoutDocument><avalon:LayoutDocument Title="TCP Client"><Frame Source="./View/TcpClientPage.xaml"/></avalon:LayoutDocument><avalon:LayoutDocument Title="MainWindow.xaml"></avalon:LayoutDocument><avalon:LayoutDocument Title="MainWindow.xaml.cs"></avalon:LayoutDocument></avalon:LayoutDocumentPane></avalon:LayoutDocumentPaneGroup><avalon:LayoutAnchorablePaneGroup DockMinHeight="30" DockHeight="100" FloatingHeight="180"><avalon:LayoutAnchorablePane x:Name="panelBottom"><avalon:LayoutAnchorable Title="Output"></avalon:LayoutAnchorable><avalon:LayoutAnchorable Title="Exception"></avalon:LayoutAnchorable><avalon:LayoutAnchorable Title="Error"></avalon:LayoutAnchorable></avalon:LayoutAnchorablePane></avalon:LayoutAnchorablePaneGroup></avalon:LayoutPanel><avalon:LayoutAnchorablePaneGroup DockMinWidth="50" DockWidth="150" FloatingWidth="270"><avalon:LayoutAnchorablePane x:Name="panelRight" DockWidth="240" FloatingWidth="240"><avalon:LayoutAnchorable Title="Solution"></avalon:LayoutAnchorable><avalon:LayoutAnchorable Title="Property"></avalon:LayoutAnchorable></avalon:LayoutAnchorablePane></avalon:LayoutAnchorablePaneGroup></avalon:LayoutPanel></avalon:LayoutRoot></avalon:DockingManager><Border Grid.Row="2" Background="{DynamicResource SliderBackground}" Height="20"></Border></Grid>
</Window>

2、TCP client的UI代码

<Page x:Class="WPF_Demo_V2.View.TcpClientPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPF_Demo_V2.View"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"Title="TcpClientPage"><Page.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="../Resource/Dictionary/DarkStyle.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Page.Resources><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="5*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Grid Grid.Row="0"><Grid.ColumnDefinitions><ColumnDefinition Width="0.5*"/><ColumnDefinition Width="*"/><ColumnDefinition Width="0.5*"/><ColumnDefinition Width="*"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Label Grid.Column="0" Margin="5" Content="服务器IP:" HorizontalContentAlignment="Right" Foreground="{DynamicResource Foreground}"/><TextBox Grid.Column="1" Margin="5" Text="{Binding Ip}" Foreground="{DynamicResource Foreground}" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Background="{DynamicResource SliderBackground}"/><Label Grid.Column="2"  Margin="5" Content="Port:"  HorizontalContentAlignment="Right" Foreground="{DynamicResource Foreground}" /><TextBox Grid.Column="3" Margin="5" Text="{Binding Port}" Foreground="{DynamicResource Foreground}" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Background="{DynamicResource SliderBackground}"/><Button Grid.Column="4" Margin="40,5" BorderBrush="{DynamicResource Green}"  Content="{Binding BtnStartOrStop}" Command="{Binding StartOrStopClientCommand}" Background="{DynamicResource SliderBackground}" Foreground="{DynamicResource Foreground}"/></Grid><RichTextBox Grid.Row="1" x:Name="myRichTextBox" Background="{DynamicResource WindowBackground}" IsReadOnly="True" Foreground="{DynamicResource Foreground}"><RichTextBox.ContextMenu><ContextMenu><MenuItem Header="清空" Command="{Binding ClearRichTextData}"/></ContextMenu></RichTextBox.ContextMenu><FlowDocument><Paragraph x:Name="progressPara"></Paragraph></FlowDocument></RichTextBox><!--<TextBox  Text="{Binding ServerLog}" IsReadOnly="True" Name="txtLog" AcceptsReturn="True" TextWrapping="Wrap" Background="{DynamicResource WindowBackground}" Foreground="{DynamicResource Foreground}"/>--><Grid Grid.Row="2" Margin="0,2" ><Grid.ColumnDefinitions><ColumnDefinition Width="3.5*"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><TextBox Grid.Column="0" Text="{Binding ServerSendMsg}" x:Name="txtMsg"  AcceptsReturn="True" TextWrapping="Wrap" Background="{DynamicResource WindowBackground}" Foreground="{DynamicResource Foreground}" IsEnabled="{Binding IsEnable}"/><Grid Grid.Column="1" ><Grid.RowDefinitions><RowDefinition /><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Button Grid.Row="0" Content="发送消息" Margin="40,5" Command="{Binding SendMsgCommand}" BorderBrush="{DynamicResource Green}" Background="{DynamicResource SliderBackground}" Foreground="{DynamicResource Foreground}" IsEnabled="{Binding SendMagIsEnable}"/><StackPanel Grid.Row="1" Orientation="Horizontal"><TextBox Width="60" Margin="2" Text="{Binding AutoSendTimes}" VerticalAlignment="Center" HorizontalContentAlignment="Right"  Background="{DynamicResource WindowBackground}" Foreground="{DynamicResource Foreground}" IsEnabled="{Binding IsEnable}"/><TextBlock Text="ms" VerticalAlignment="Center" Background="{DynamicResource WindowBackground}" Foreground="{DynamicResource Foreground}"/><CheckBox VerticalAlignment="Center" Style="{DynamicResource CheckBoxStyle}" Content="定时发送" Width="80"  Background="{DynamicResource WindowBackground}" Foreground="{DynamicResource Foreground}" IsChecked="{Binding AutoSendIsCheck}"/></StackPanel></Grid></Grid></Grid>
</Page>

3、Tcp client后台代码实现

using System;
using System.Collections.Generic;
using System.DirectoryServices.ActiveDirectory;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Timers;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using CommunityToolkit.Mvvm;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using TouchSocket.Core;
using TouchSocket.Sockets;namespace WPF_Demo_V2.ViewModel
{partial class TcpClientViewModel:ObservableObject{#region 变量private TcpClient tcpClient;private System.Timers.Timer timer;public Action<Brush, string> UpdataRichText { get; set; }public Action<Brush, string, Brush, string> UpdataRichTextLine { get; set; }public Action<bool> ClearRichText { get; set; }bool isStart = false;bool isAuto = false;#endregion#region 构造函数public TcpClientViewModel(){tcpClient = new TcpClient();}#endregion#region 属性[ObservableProperty]//[NotifyCanExecuteChangedFor(nameof())]public string? ip = "192.168.2.120";//CommunityToolkit.MVVM 属性用法1 小写首字母[ObservableProperty]public string? _Port = "2300";    //CommunityToolkit.MVVM 属性用法2 下划线+大写首字母[ObservableProperty]public string _BtnStartOrStop = "连接";[ObservableProperty]public string? _ServerSendMsg;[ObservableProperty]public string? _AutoSendTimes = "1000";//100ms[ObservableProperty]public bool? _SendMagIsEnable = false;[ObservableProperty]public bool? _IsEnable = true;[ObservableProperty]private bool _AutoSendIsCheck = false;/// <summary>/// AutoSendIsCheck属性已修改触发的事件,使用partial关键字自动补全该事件,可选/// </summary>/// <param name="value"></param>partial void OnAutoSendIsCheckChanged(bool value){isAuto = value;IsEnable = !value;if (isAuto) {timer?.Dispose();timer = new System.Timers.Timer { Interval = Convert.ToUInt32(AutoSendTimes), AutoReset = true, Enabled = true };timer.Elapsed += (s, e) => Application.Current.Dispatcher.BeginInvoke(new Action(() =>{SendMsg();}));}else{if (timer != null){timer?.Dispose();}}}/// <summary>/// AutoSendIsCheck属性将要修改触发的事件,使用partial关键字自动补全该事件,可选/// </summary>/// <param name="value"></param>partial void OnAutoSendIsCheckChanging(bool value){}#endregion#region 方法#region 开始/停止服务[RelayCommand]private void StartOrStopClient()      //CommunityToolkit.MVVM 命令command用法:Binding部分对应StartOrStopServerCommand 必须包含<MethodName>Command{if (!isStart){BtnStartOrStop = "断开";isStart = true;if (string.IsNullOrWhiteSpace(Ip) || string.IsNullOrWhiteSpace(Port)){MessageBox.Show("IP 和 Port 不能为空");return;}try{if (tcpClient != null){tcpClient.Setup(new TouchSocket.Core.TouchSocketConfig().SetRemoteIPHost($"{Ip}:{Port}").ConfigureContainer(a => {a.AddConsoleLogger();//添加一个日志注入}));tcpClient.Connect();//连接,连接不成功抛出异常SendMagIsEnable = true;tcpClient.Logger.Info("客户端成功连接");tcpClient.Received = (client, e) => {//从服务器收到信息string mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);string ServerLog = $"接收到信息:{mes}";DateTime dateTime = DateTime.Now;string times = dateTime.ToString("yyyy-MM-dd HH:mm:ss");Application.Current.Dispatcher.Invoke(() =>{UpdataRichTextLine.Invoke((Brush)new BrushConverter().ConvertFromString("#FFD9ECFF"), $"【{times} Client】", (Brush)new BrushConverter().ConvertFromString("#55B155"), $"{ServerLog}");//UpdataRichText.Invoke((Brush)new BrushConverter().ConvertFromString("#FFD9ECFF"), $"【{times} client】:");//UpdataRichText.Invoke((Brush)new BrushConverter().ConvertFromString("#55B155"), $"{ServerLog}");});Console.WriteLine($"接收到信息:{mes}");return EasyTask.CompletedTask;};}}catch (Exception ex){MessageBox.Show($"连接服务器失败: {ex.Message}");BtnStartOrStop = "连接";isStart = false;SendMagIsEnable = false;}}else{BtnStartOrStop = "连接";isStart = false;SendMagIsEnable = false;// 关闭Socketif (tcpClient != null){tcpClient.Close();}}}#endregion#region 发送信息按钮事件[RelayCommand]private void SendMsg(){if(!string.IsNullOrEmpty(ServerSendMsg)){byte[] data = Encoding.Default.GetBytes(ServerSendMsg);tcpClient.Send(data);}}#endregion#endregion}
}

4、UI与后台代码的关联

using CommunityToolkit.Mvvm.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WPF_Demo_V2.ViewModel;namespace WPF_Demo_V2.View
{/// <summary>/// TcpClientPage.xaml 的交互逻辑/// </summary>public partial class TcpClientPage : Page{FlowDocument Doc = new FlowDocument();public TcpClientPage(){InitializeComponent();this.DataContext = new TcpClientViewModel() { UpdataRichText = ShowRichText, ClearRichText = ClearText, UpdataRichTextLine = ShowRichTextLine };}private void ShowRichText(Brush brush, string txt){//this.Dispatcher.Invoke(() => {var p = new Paragraph(); // Paragraph 类似于 html 的 P 标签var r = new Run(txt); // Run 是一个 Inline 的标签p.Inlines.Add(r);p.LineHeight = 1;p.Foreground = brush;//设置字体颜色Doc.Blocks.Add(p);myRichTextBox.Document = Doc;myRichTextBox.ScrollToEnd();//});}private void ShowRichTextLine(Brush fbrush, string ftxt, Brush bbrush, string btxt){//this.Dispatcher.Invoke(() => {var p = new Paragraph(); // Paragraph 类似于 html 的 P 标签var r1 = new Run(ftxt){Foreground = fbrush};p.Inlines.Add(r1);var r2 = new Run(btxt){Foreground = bbrush};p.Inlines.Add(r2);p.LineHeight = 1;Doc.Blocks.Add(p);myRichTextBox.Document = Doc;myRichTextBox.ScrollToEnd();//});}private void ClearText(bool obj){if (obj){System.Windows.Documents.FlowDocument doc = myRichTextBox.Document;doc.Blocks.Clear();}}}
}

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

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

相关文章

GPT-4o Mini:探索最具成本效益的小模型在软件开发中的应用

随着人工智能技术的迅猛发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也取得了显著的进步。OpenAI 最新发布的 GPT-4o Mini 模型&#xff0c;以其卓越的性能和极具竞争力的价格&#xff0c;成为了广大开发者关注的焦点。作为一名长期关注人工智能及其在软件开发…

破局产品同质化:解锁3D交互式营销新纪元!

近年来&#xff0c;随着数字体验经济的蓬勃发展&#xff0c;3D交互式营销作为一种创新手段迅速崛起&#xff0c;它巧妙地解决了传统产品展示中普遍存在的缺乏差异性和互动性的问题&#xff0c;使您的产品在激烈的市场竞争中独树一帜&#xff0c;脱颖而出。 若您正面临产品营销…

【Python数据结构与算法】枚举----特殊密码锁

题目&#xff1a;特殊密码锁 描述 有一种特殊的二进制密码锁&#xff0c;由n个相连的按钮组成&#xff08;1<n<30&#xff09;&#xff0c;按钮有凹/凸两种状态&#xff0c;用手按按钮会改变其状态。 然而让人头疼的是&#xff0c;当你按一个按钮时&#xff0c;跟它相邻…

自定义协议(应用层协议)——网络版计算机基于TCP传输协议

应用层&#xff1a;自定义网络协议&#xff1a;序列化和反序列化&#xff0c;如果是TCP传输的&#xff1a;还要关心区分报文边界&#xff08;在序列化设计的时候设计好&#xff09;——粘包问题 1、首先想要使用TCP协议传输的网络&#xff0c;服务器和客户端都应该要创建自己…

无损放大图片工具

一、简介 1、Upscayl 是一款无损放大图片工具&#xff0c;支持CPU和GPU&#xff0c;扩图速度特别的快&#xff0c;而且效果特别的好。而且它有多种模型&#xff0c;比如说艺术动漫风格、真实风格、快速生成等等。最大支持16倍放大和亿级别像素&#xff0c;同时支持Windows、Mac…

Ruoyi-WMS本地运行

所需软件 1、JDK&#xff1a;8 安装包&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.htmlopen in new window 安装文档&#xff1a;https://cloud.tencent.com/developer/article/1698454open in new window 2、Redis 3.0 安装包&a…

Weakly Supervised Contrastive Learning 论文阅读

Abstract 无监督视觉表示学习因对比学习的最新成就而受到计算机视觉领域的广泛关注。现有的大多数对比学习框架采用实例区分作为预设任务&#xff0c;将每个实例视为一个不同的类。然而&#xff0c;这种方法不可避免地会导致类别冲突问题&#xff0c;从而损害所学习表示的质量…

鸿蒙应用框架开发【多HAP】程序框架

多HAP 介绍 本示例展示多HAP开发&#xff0c;简单介绍了多HAP的使用场景&#xff0c;应用包含了一个entry HAP和两个feature HAP&#xff0c;两个feature HAP分别提供了音频和视频播放组件&#xff0c;entry中使用了音频和视频播放组件。 三个模块需要安装三个hap包&#xff…

玩游戏总缺少dll文件怎么办,免费修复DirectX方法

玩游戏或者运行程序时&#xff0c;突然蹦出个提示说“缺少xxxx.dll”&#xff0c;简直让人火大&#xff01;你是不是也遇到过这种情况&#xff0c;重新安装游戏也没用&#xff0c;各种错误提示让人崩溃&#xff1f;别急&#xff0c;阿星今天就来给你支个招&#xff0c;让这烦人…

电子签章-开放签应用

开放签电子签章系统开源工具版旨在将电子签章、电子合同系统开发中的前后端核心技术开源开放&#xff0c;适合有技术能力的个人 / 团队学习或自建电子签章 \ 电子合同功能或应用&#xff0c;避免研发同仁在工作过程中重复造轮子&#xff0c;降低电子签章技术研发要求&#xff0…

Spring源码学习笔记之@Async源码

文章目录 一、简介二、异步任务Async的使用方法2.1、第一步、配置类上加EnableAsync注解2.2、第二步、自定义线程池2.2.1、方法一、不配置自定义线程池使用默认线程池2.2.2、方法二、使用AsyncConfigurer指定线程池2.2.3、方法三、使用自定义的线程池Excutor2.2.4、方法四、使用…

7.25 阿里云OSS上传 + 后台返回token + 导出excel

1.阿里云Oss上传 只需要一点就是上传到云端后&#xff0c;前端调用上传文件接口&#xff0c;返回一个资源路径。 接着在提交表单时&#xff0c;前端把这个路径设置为img的参数即可。 1.1上传限制 只上传图片 Api("阿里云文件管理") CrossOrigin //跨域 RestContr…

算法 定长按组翻转链表

一、题目 已知一个链表的头部head&#xff0c;每k个结点为一组&#xff0c;按组翻转。要求返回翻转后的头部 k是一个正整数&#xff0c;它的值小于等于链表长度。如果节点总数不是k的整数倍&#xff0c;则剩余的结点保留原来的顺序。示例如下&#xff1a; &#xff08;要求不…

谷粒商城实战笔记-60-商品服务-API-品牌管理-效果优化与快速显示开关

文章目录 一&#xff0c;显示状态列改为switch开关二&#xff0c;监听状态改变 首先&#xff0c;把ESLint语法检查关掉&#xff0c;因为这个语法检查过于严格&#xff0c;在控制台输出很多错误信息&#xff0c;干扰开发。 在build目录下下webpack.base.conf.js中&#xff0c;把…

昇思MindSpore学习总结十七 —— 基于MindSpore通过GPT实现情感分类

1、要求 2、导入了一些必要的库和模块 以便在使用MindSpore和MindNLP进行深度学习任务时能使用各种功能&#xff0c;比如数据集处理、模型训练、评估和回调功能。 import os # 导入操作系统相关功能的模块&#xff0c;如文件和目录操作import mindspore # 导入MindSpore库&a…

数据开发/数仓工程师上手指南(二)数仓构建分层概念

前言 回顾上篇文章我们可以用思维导图一遍概览&#xff1a; 在了解了数仓的基本架构之后&#xff0c;我们还需要掌握数仓构建方法&#xff0c;也就是了解数仓是如何建模的&#xff0c;有什么规则和通用方法。我们应该如何去构建一个性能良好、稳定高效、契合业务的数据仓库。…

图形/视图架构的坐标系

图形/视图架构有 3 个有效的坐标系&#xff1a;场景坐标系、视图坐标系、图形项坐标系。 视图坐标系 视图坐标系就是视图组件的物理坐标系&#xff0c;单位是像素。QGraphicsView 视口的左上角坐标总是(0,0)。 场景坐标系 场景坐标系定义了所有图形项的基础坐标&#xff0c;场…

如何排查GD32 MCU复位是由哪个复位源导致的?

上期为大家讲解了GD32 MCU复位包括电源复位和系统复位&#xff0c;其中系统复位还包括独立看门狗复位、内核软复位、窗口看门狗复位等&#xff0c;在一个GD32系统中&#xff0c;如果莫名其妙产生了MCU复位&#xff0c;如何排查具体是由哪个复位源导致的呢&#xff1f; GD32 MC…

Idea如何查看Maven依赖树

1、使用idea自带的功能查看依赖树 2、使用Maven Helper插件 https://zhuanlan.zhihu.com/p/699663369

《Milvus Cloud向量数据库指南》——监管机构和社区:开源许可证标准的守护者与推动者

在开源软件的浩瀚宇宙中,监管机构和社区构成了其稳定运行与持续发展的双轮驱动。这些组织不仅定义了开源的本质,还通过制定、维护和执行许可证标准,确保了开源生态的开放性、透明性和协作精神得以传承。其中,开源倡议组织(OSI)、自由软件基金会(FSF)以及Apache软件基金…