C#使用UdpClient發送和接收UDP數據示例


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM