直接上代码:
xmal:
<Window x:Class="UDPSocket.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="600" Width="800" WindowStartupLocation="CenterScreen" Closing="MainWindow_Closing"> <Grid> <GroupBox Header="发送数据" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="380" Height="545" Background="AliceBlue"> <StackPanel> <RichTextBox Name="txtSendMssg" HorizontalAlignment="Left" Margin="5" VerticalAlignment="Top" Height="450" Width="355" Background="White"/> <Button Margin="50 10" Content="发送数据" Height="45" Click="btnSend_Click"/> </StackPanel> </GroupBox> <GroupBox Header="接收数据" HorizontalAlignment="Right" Margin="0,10,10,0" VerticalAlignment="Top" Width="380" Height="545" Background="AliceBlue"> <StackPanel> <RichTextBox Name="txtRecvMssg" HorizontalAlignment="Left" Margin="5,5,5,5" VerticalAlignment="Top" Height="450" Width="355" Background="White"/> <Button Margin="50 10" Content="接收数据/停止接收" Height="45" Click="btnRecv_Click"/> </StackPanel> </GroupBox> </Grid> </Window>
后台:
using System.Net.Sockets; using System.Net; using System.Threading; using System.Windows.Threading; namespace UDPSocket { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } /// <summary> /// 用于UDP发送的网络服务类 /// </summary> private UdpClient udpcSend; /// <summary> /// 用于UDP接收的网络服务类 /// </summary> private UdpClient udpcRecv; /// <summary> /// 按钮:发送数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSend_Click(object sender, EventArgs e) { TextRange tr = new TextRange(txtSendMssg.Document.ContentStart, txtSendMssg.Document.ContentEnd); if (string.IsNullOrWhiteSpace(tr.Text)) { MessageBox.Show("请先输入待发送内容"); return; } // 匿名发送 //udpcSend = new UdpClient(0); // 自动分配本地IPv4地址 // 实名发送 IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234); // 本机IP,指定的端口号 udpcSend = new UdpClient(localIpep); Thread thrSend = new Thread(SendMessage); thrSend.Start(tr.Text); } /// <summary> /// 发送信息 /// </summary> /// <param name="obj"></param> private void SendMessage(object obj) { string message = (string)obj; byte[] sendbytes = Encoding.Unicode.GetBytes(message); IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788); // 发送到的IP地址和端口号 udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep); udpcSend.Close(); ResetTextBox(txtSendMssg); } /// <summary> /// 开关:在监听UDP报文阶段为true,否则为false /// </summary> bool IsUdpcRecvStart = false; /// <summary> /// 线程:不断监听UDP报文 /// </summary> Thread thrRecv; /// <summary> /// 按钮:接收数据开关 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRecv_Click(object sender, EventArgs e) { if (!IsUdpcRecvStart) // 未监听的情况,开始监听 { IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788); // 本机IP和监听端口号 udpcRecv = new UdpClient(localIpep); thrRecv = new Thread(ReceiveMessage); thrRecv.Start(); IsUdpcRecvStart = true; ShowMessage(txtRecvMssg, "UDP监听器已成功启动"); } else // 正在监听的情况,终止监听 { thrRecv.Abort(); // 必须先关闭这个线程,否则会异常 udpcRecv.Close(); IsUdpcRecvStart = false; ShowMessage(txtRecvMssg, "UDP监听器已成功关闭"); } } /// <summary> /// 接收数据 /// </summary> /// <param name="obj"></param> private void ReceiveMessage(object obj) { IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0); while (true) { try { byte[] bytRecv = udpcRecv.Receive(ref remoteIpep); string message = Encoding.Unicode.GetString(bytRecv, 0, bytRecv.Length); ShowMessage(txtRecvMssg, string.Format("{0}[{1}]", remoteIpep, message.Trim())); } catch (Exception ex) { ShowMessage(txtRecvMssg, ex.Message); break; } } } // 向RichTextBox中添加文本 delegate void ShowMessageDelegate(RichTextBox txtbox, string message); private void ShowMessage(RichTextBox txtbox, string message) { //if (txtbox.InvokeRequired) //{ // ShowMessageDelegate showMessageDelegate = ShowMessage; // txtbox.Dispatcher.Invoke(showMessageDelegate, new object[] { txtbox, message }); //} //else //{ // // txtbox.Text += message + "\r\n"; //} Console.WriteLine(message); } // 清空指定RichTextBox中的文本 delegate void ResetTextBoxDelegate(RichTextBox txtbox); private void ResetTextBox(RichTextBox txtbox) { //if (txtbox.InvokeRequired) //{ // ResetTextBoxDelegate resetTextBoxDelegate = ResetTextBox; // txtbox.Dispatcher.Invoke(resetTextBoxDelegate, new object[] { txtbox }); //} //else //{ //// txtbox.Text = ""; //} } /// <summary> /// 关闭程序,强制退出 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) { Environment.Exit(0); } } }