因为UDP是无连接的,无需建立连接,就可以收发数据。使用Sokit 工具测试编写的代码是否正常工作。
开启UDP侦听IP和端口,编写代码实现数据收发,服务端如下:

编写简易代码UI如下:

向IP 127.0.0.1,9902 端口发送数据,测试发送数据OK

测试接收服务端发送的数据OK

1. UI设计
<Window x:Class="Udp_Test1.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:Udp\_Test1"
mc:Ignorable="d"
Loaded="Window_Loaded"
Title="UDP Test1" Height="450" Width="500">
<Window.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="3"/>
<Setter Property="Padding" Value="2"/>
</Style>
<Style TargetType="TextBox">
<Setter Property="Margin" Value="3"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" >服务器IP地址:</TextBlock>
<TextBox Grid.Column="1" x:Name="txtServerIP" >127.0.0.1</TextBox>
<TextBlock Grid.Column="2" >服务器端口:</TextBlock>
<TextBox Grid.Column="3" x:Name="txtServerPort" >9902</TextBox>
</Grid>
<DockPanel Grid.Row="1" Margin="3">
<TextBlock DockPanel.Dock="Left">发送数据:</TextBlock>
<Button DockPanel.Dock="Right" x:Name="btnSendData" Click="btnSendData_Click" Margin="3" VerticalAlignment="Center">发送数据</Button>
<TextBox x:Name="txtSendData"></TextBox>
</DockPanel>
<TextBlock Grid.Row="2">
接收到服务器发来的数据:
</TextBlock>
<TextBox x:Name="txtRecivedMessage" Grid.Row="3" TextWrapping="Wrap" Margin="5" VerticalAlignment="Stretch" VerticalScrollBarVisibility="Visible"></TextBox>
</Grid>
</Window>
2. 代码设计
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 System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Udp_Test1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
static Socket client;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9901));
//接收发送给本机ip对应端口号的数据报
Task.Run(async() =>
{
while(true)
{
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
byte[] buffer = new byte[1024];
int length = client.ReceiveFrom(buffer, ref point);//接收数据报
string message = Encoding.UTF8.GetString(buffer, 0, length);
await this.txtRecivedMessage.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
{
txtRecivedMessage.AppendText("Sever (" + point.ToString() + ") :" +message + "\r\\n");
}));
}
});
}
private void btnSendData_Click(object sender, RoutedEventArgs e)
{
//向特定IP的主机的端口发送数据--ServerIP,Port
//EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9902);
EndPoint point = new IPEndPoint(IPAddress.Parse(txtServerIP.Text), int.Parse(txtServerPort.Text));
client.SendTo(Encoding.UTF8.GetBytes(txtSendData.Text), point);
}
}
}
简单的实现了UDP数据的收发。
版权声明:本文为flysh05原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。