C#使用UdpClient發送和接收UDP數據示例
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 //本段代碼中需要新增加的命名空間 12 using System.Net.Sockets; 13 using System.Net; 14 using System.Threading; 15 16 namespace WinForm1 17 { 18 public partial class Form1 : Form 19 { 20 public Form1() 21 { 22 InitializeComponent(); 23 } 24 /// <summary> 25 /// 用於UDP發送的網絡服務類 26 /// </summary> 27 private UdpClient udpcSend; 28 /// <summary> 29 /// 用於UDP接收的網絡服務類 30 /// </summary> 31 private UdpClient udpcRecv; 32 33 /// <summary> 34 /// 按鈕:發送數據 35 /// </summary> 36 /// <param name="sender"></param> 37 /// <param name="e"></param> 38 private void btnSend_Click(object sender, EventArgs e) 39 { 40 if (string.IsNullOrWhiteSpace(txtSendMssg.Text)) 41 { 42 MessageBox.Show("請先輸入待發送內容"); 43 return; 44 } 45 46 // 匿名發送 47 //udpcSend = new UdpClient(0); // 自動分配本地IPv4地址 48 // 實名發送 49 IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345); // 本機IP,指定的端口號 50 udpcSend = new UdpClient(localIpep); 51 Thread thrSend = new Thread(SendMessage); 52 thrSend.Start(txtSendMssg.Text); 53 } 54 55 /// <summary> 56 /// 發送信息 57 /// </summary> 58 /// <param name="obj"></param> 59 private void SendMessage(object obj) 60 { 61 string message = (string)obj; 62 byte[] sendbytes = Encoding.Unicode.GetBytes(message); 63 IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8848); // 發送到的IP地址和端口號 64 udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep); 65 udpcSend.Close(); 66 ResetTextBox(txtSendMssg); 67 } 68 69 /// <summary> 70 /// 開關:在監聽UDP報文階段為true,否則為false 71 /// </summary> 72 bool IsUdpcRecvStart = false; 73 /// <summary> 74 /// 線程:不斷監聽UDP報文 75 /// </summary> 76 Thread thrRecv; 77 78 /// <summary> 79 /// 按鈕:接收數據開關 80 /// </summary> 81 /// <param name="sender"></param> 82 /// <param name="e"></param> 83 private void btnRecv_Click(object sender, EventArgs e) 84 { 85 if (!IsUdpcRecvStart) // 未監聽的情況,開始監聽 86 { 87 IPEndPoint localIpep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8848); // 本機IP和監聽端口號 88 udpcRecv = new UdpClient(localIpep); 89 thrRecv = new Thread(ReceiveMessage); 90 thrRecv.Start(); 91 IsUdpcRecvStart = true; 92 ShowMessage(txtRecvMssg, "UDP監聽器已成功啟動"); 93 } 94 else // 正在監聽的情況,終止監聽 95 { 96 thrRecv.Abort(); // 必須先關閉這個線程,否則會異常 97 udpcRecv.Close(); 98 IsUdpcRecvStart = false; 99 ShowMessage(txtRecvMssg, "UDP監聽器已成功關閉"); 100 } 101 } 102 103 /// <summary> 104 /// 接收數據 105 /// </summary> 106 /// <param name="obj"></param> 107 private void ReceiveMessage(object obj) 108 { 109 IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0); 110 while (true) 111 { 112 try 113 { 114 byte[] bytRecv = udpcRecv.Receive(ref remoteIpep); 115 string message = Encoding.Unicode.GetString(bytRecv, 0, bytRecv.Length); 116 ShowMessage(txtRecvMssg,string.Format("{0}[{1}]", remoteIpep, message)); 117 } 118 catch (Exception ex) 119 { 120 ShowMessage(txtRecvMssg, ex.Message); 121 break; 122 } 123 } 124 } 125 126 // 向RichTextBox中添加文本 127 delegate void ShowMessageDelegate(RichTextBox txtbox, string message); 128 private void ShowMessage(RichTextBox txtbox, string message) 129 { 130 if (txtbox.InvokeRequired) 131 { 132 ShowMessageDelegate showMessageDelegate = ShowMessage; 133 txtbox.Invoke(showMessageDelegate, new object[] { txtbox, message }); 134 } 135 else 136 { 137 txtbox.Text += message + "\r\n"; 138 } 139 } 140 141 // 清空指定RichTextBox中的文本 142 delegate void ResetTextBoxDelegate(RichTextBox txtbox); 143 private void ResetTextBox(RichTextBox txtbox) 144 { 145 if (txtbox.InvokeRequired) 146 { 147 ResetTextBoxDelegate resetTextBoxDelegate = ResetTextBox; 148 txtbox.Invoke(resetTextBoxDelegate, new object[] { txtbox }); 149 } 150 else 151 { 152 txtbox.Text = ""; 153 } 154 } 155 156 /// <summary> 157 /// 關閉程序,強制退出 158 /// </summary> 159 /// <param name="sender"></param> 160 /// <param name="e"></param> 161 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 162 { 163 Environment.Exit(0); 164 } 165 } 166 }