udp

udp和tcp都是传输协议,最大的不同是,tcp通信前需要建立连接,是更可靠的通信协议,而udp是一个无连接的传输协议,可直接发送数据。两种协议不分优劣,各有各的应用场景,实际应用往往会同时使用两种协议。

C#实现

C#代码实现udp通信的步骤比较简单。
假设:A要向B发送消息。
做法:首先,B需要创建UdpClient,监听某端口;然后,A创建UdpClient,向B的监听端口发送消息;最后B接收到消息,处理消息;
示例程序运行如下:

主要源码

接收类

public class UdpReceiver{public UdpReceiver(int _port){port = _port;}int port;public void StartReceiveData(Action<string> receiveData){Task.Run(() => { receiveDataAsync(receiveData); });}private async void receiveDataAsync(Action<string> receiveData){UdpClient udpClient = new UdpClient(port);while (true){var result = await udpClient.ReceiveAsync();string message = Encoding.UTF8.GetString(result.Buffer);receiveData?.Invoke(message);}}}

发送类

public class UdpSender{public UdpSender(string remoteIp, int port){remoteEndPoint = new IPEndPoint(IPAddress.Parse(remoteIp), port);}IPEndPoint remoteEndPoint = null;public void Send(string message){UdpClient udpClient = new UdpClient();byte[] data = Encoding.UTF8.GetBytes(message);udpClient.Send(data, data.Length, remoteEndPoint);udpClient.Close();}}

监听命令

public DelegateCommand StartListen{get{return new DelegateCommand((port) => {int p = 0;if (!Int32.TryParse(port.ToString(), out p) || p<=1024){MessageInfos.Add(new MessageInfo() { From = "系统消息", Message = "本机端口输入有误!" });return;}try{StartEnabled = false;UdpReceiver receiver = new UdpReceiver(p);receiver.StartReceiveData((msg) =>{MessageInfos.Add(new MessageInfo() { From = msg.Split(',')[0], Message = msg.Split(',')[1] });});MessageInfos.Add(new MessageInfo() { From = "系统消息", Message = "正在监听端口:"+p.ToString() });}catch (Exception e){MessageInfos.Add(new MessageInfo() { From = "系统消息", Message = "错误:" + e.Message });startEnabled = true;}});}}

发送命令

public DelegateCommand Send{get{return new DelegateCommand((msg) => {if (string.IsNullOrEmpty(RemoteIp) || RemotePort <= 0){MessageInfos.Add(new MessageInfo() { From = "系统消息", Message = "对方IP及端口输入有误!"});return;}UdpSender sender = new UdpSender(RemoteIp, RemotePort);try{sender.Send(LocalIp + ":" + LocalPort.ToString()+","+msg.ToString());MessageInfos.Add(new MessageInfo() { From = LocalIp + ":" + LocalPort.ToString(), Message = msg.ToString() });}catch (Exception e){MessageInfos.Add(new MessageInfo() { From = "系统消息", Message = "错误:" + e.Message });}});}}

UI绑定

<Window x:Class="UdpDemo.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:UdpDemo"mc:Ignorable="d"Title="Udp点对点通信示例" Height="360" Width="600"><Grid><Grid.RowDefinitions><RowDefinition Height="50"/><RowDefinition Height="50"/><RowDefinition /></Grid.RowDefinitions><StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="20,5"><TextBlock Text="本机IP"/><TextBox Text="{Binding LocalIp}" Width="120" Margin="5,0" IsReadOnly="True" /><TextBlock Text="本机端口" Margin="5,0"/><TextBox x:Name="txt_Port" Text="{Binding LocalPort}" Width="60" Margin="5,0" IsReadOnly="{Binding Listening}" /><Button Width="80" Content="开始监听" Command="{Binding StartListen}" CommandParameter="{Binding ElementName=txt_Port,Path=Text}" IsEnabled="{Binding StartEnabled}" Margin="5,0" /></StackPanel><StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Bottom" Margin="20,5"><TextBlock Text="对方IP"/><TextBox Text="{Binding RemoteIp}" Width="120" Margin="5,0" /><TextBlock Text="对方端口" Margin="5,0"/><TextBox Text="{Binding RemotePort}" Width="60" Margin="5,0" /><Button Width="80" Content="发送消息" Command="{Binding Send}" CommandParameter="{Binding ElementName=txt_msg,Path=Text}" Margin="5,0" /><TextBox x:Name="txt_msg" Width="160" Text="这是一个测试消息!"/></StackPanel><ListView Grid.Row="2" ItemsSource="{Binding MessageInfos}" Margin="5"><ListView.ItemTemplate><DataTemplate><StackPanel Margin="0,2"><TextBlock Text="{Binding From}" Foreground="Gray"/><TextBlock Text="{Binding Message}" Foreground="Black"/></StackPanel></DataTemplate></ListView.ItemTemplate></ListView></Grid>
</Window>

完整源码分享

完整源码下载:下载源码
(备注:使用vs2022打开)

C#实现udp点对点通信的完整示例相关推荐

  1. DHCP 和 DHCP-Realy 功能演示完整示例

    DHCP 和 DHCP-Realy 功能演示完整示例 DHCP 原理详解 DHCP 和 DHCP-Realy 功能演示完整示例 1.组网拓扑和需求 2.DHCP Server 配置 2.1 配置 VM ...

  2. java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析

    基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也 ...

  3. eclipse 创建maven 项目 动态web工程完整示例

    需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...

  4. ViewPager详解(一)——ViewPager的基本使用完整示例

    MainActivity如下: package cn.ww;import java.lang.reflect.Field;import android.app.Activity; import and ...

  5. 【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

    文章目录 一.泛型简介 二.泛型类 三.泛型方法 四.静态方法的泛型 五.泛型类与泛型方法完整示例 一.泛型简介 泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ; j ...

  6. 【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )

    文章目录 I . Lambda 表达式 简介 II . Lambda 表达式语法 III . Lambda 表达式类型 IV . Lambda 表达式返回值 V . Lambda 表达式调用 VI . ...

  7. react-template 包含客户端,服务端渲染完整示例

    原文链接 React version 16.2 版本脚手架 包含客户端,服务端渲染完整示例,使用了最新的react,并实现version 16.2 最新的服务端渲染; 解决了一些之前的服务端渲染bug ...

  8. 利用ffmpeg来进行视频解码的完整示例代码

    (转)利用ffmpeg来进行视频解码的完整示例代码(H.264) Decode() { FILE  * inpf; int  nWrite; int  i,p; int  nalLen; unsign ...

  9. java自建ocr完整示例_Java 7:完整的invokedynamic示例

    java自建ocr完整示例 我当前的Java 7系列中的另一个博客条目. 这次它处理的是invokedynamic,这是JVM上用于方法调用的新字节码指令. invokedynamic指令允许呼叫站点 ...

最新文章

  1. 密码危机:深度学习正在加速密码破解!
  2. mysql打包备份数据到_thinkPHP使用pclzip打包备份mysql数据库的方法
  3. JVM 的 工作原理,层次结构 以及 GC工作原理
  4. AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署
  5. 修改同一张表的同一个字段的两个不同的值。
  6. linux中引入python的tkinter模块
  7. python matplot模块
  8. 爱奇艺Android移动客户端app瘦身经验
  9. windows系统c语言编译器安装
  10. matlab实现jpg图片转gif
  11. 国内国外很火爆的代码生成器
  12. Nova 实现的 Fit Instance NUMA to Host NUMA 算法
  13. 【历史上的今天】2 月 7 日:“电脑大王”王安诞生;发明“上网冲浪”的程序员出生;2013 年图灵奖得主生日
  14. 做市商交易策略-期货
  15. java计算机毕业设计民航售票管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  16. 计算机的cpu占用到多少会卡,CPU占用100%!PC卡顿原来可以这么解决:多场景多任务也流畅...
  17. 微信小程序电商项目源代码开放连载二三事
  18. Java的Set转成逗号分隔的字符串
  19. Java中String字符串:空字符串、存放空的字符串、null的区别
  20. macOS 10.14 开机黑屏 (硬盘加密)如何备份数据

热门文章

  1. Java基础-实现zip解压缩
  2. CSR 8670 Access BlueCore I/O lines
  3. Oracle培训和认证
  4. 5G直播设备 VR+5G直播 4K+5G直播
  5. 炒币机器人:囤币,我们是“一囤到底”还是“半路抛弃
  6. 运营半年多视频号涨粉13万,如何真正挖掘视频号的潜力
  7. c语言adc采集取平均值,单片机ADC采样算法----递推平均值采样法
  8. 【STM32】寄存器位的操作方式rw、rc、rc_w0、rc_w1、rc_r、rs、rt_w、t、Res.
  9. 【GUI】Python图形界面(一)
  10. dhrystone测试结果_处理器性能测试基准程序(CoreMark)简介