实现的效果如下截图:
创建2个UDP 客户端,直接可以直接信息进行交互。主要使用UdpClient类来实现。
XAML 设计:
<Grid>
<DockPanel LastChildFill="True">
<DockPanel DockPanel.Dock="Bottom" Margin="10">
<TextBlock DockPanel.Dock="Left" Margin="5" >发送信息:</TextBlock>
<Button x:Name="btnSendMessage" Click="btnSendMessage\_Click" DockPanel.Dock="Right" Margin="5" Padding="3">发送</Button>
<TextBox x:Name="txtSendMsg" Margin=" 5 2 5 2"></TextBox>
</DockPanel>
<TextBox x:Name="txtReceiveMsg" Margin="5" TextWrapping="Wrap" DockPanel.Dock="Top" HorizontalScrollBarVisibility="Visible"></TextBox>
</DockPanel>
</Grid>
后台代码:
添加引用
using System.Net.Sockets;
using System.Net;
public partial class MainWindow : Window
{
public IPEndPoint localEndPoint { get; set; }
public IPEndPoint remoteEndPoint { get; set; }
private UdpClient Client;
private IPAddress ip;
public MainWindow()
{
InitializeComponent();
//获取本机所有IPV4
IPAddress\[\] ips = Dns.GetHostAddresses(Dns.GetHostName());
foreach (var v in ips)
{
//判断是否为IPv4
if (v.AddressFamily == AddressFamily.InterNetwork)
{
ip = v;
break;
}
}
//因为在本机上测试,所以IP是相同的,只是交换一个端口位置,就可以创建Client2
localEndPoint = new IPEndPoint(ip, 8001);
remoteEndPoint = new IPEndPoint(ip, 8002);
}
private void Window\_Loaded(object sender, RoutedEventArgs e)
{
Client = new UdpClient(localEndPoint);
AddInfo("监听IP和端口号:{0}\\n", localEndPoint);
Task.Run(() => ReceiveDataAsync());
}
private async void ReceiveDataAsync()
{
while (true)
{
var result = await Client.ReceiveAsync();
string s = Encoding.Unicode.GetString(result.Buffer);
AddInfo("来自{0}:{1}\\n", result.RemoteEndPoint, s);
}
}
private async void btnSendMessage\_Click(object sender, RoutedEventArgs e)
{
string s = txtSendMsg.Text;
byte\[\] data = Encoding.Unicode.GetBytes(s);
await Client.SendAsync(data, data.Length, remoteEndPoint);
AddInfo("向{0} 发送{1}\\n", remoteEndPoint, s);
}
private void AddInfo(string format, params object\[\] args)
{
txtReceiveMsg.Dispatcher.Invoke(() =>
{
txtReceiveMsg.Text += string.Format(format, args);
});
}
}
创建Client2,只需在localEndPoint和remoteEndPoint的端口即可。
测试正常,可以相互收发信息。