基於Socket的UDP發包程序


UDP(User Datagram Protocol,用戶數據報協議)是在互聯網中常用的傳輸層協議,該協議提供了向另一用戶程序發送的消息的最簡便的協議機制。與TCP一樣,其默認的下層協議是IP.UDP是面向操作的,不提供提交和復制保護,因此不能保證數據的可靠性傳輸。UDP一般用在可靠性較高的局域網中。

.NET 下可使用Socket 類編寫基於UDP的網絡程序,只要在創建Socket時將構造函數函數的第三個參數選為枚舉值ProtocolType.Udp即可.此外,.NET的System.Net.Sockets命名空間下還有一個UdpClient類,可專門用於UDP的網絡編程。-----摘自< C#.NET 框架高級編程技術案例教程  郭文夷等 P163>

第一種,使用Socket類

1  IPEndPoint ip = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
2             Socket  serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3             serverSocket.Bind(ip);

第二種,使用UdpClient類

1  IPAddress address = IPAddress.Parse(txtLocalIp.Text);
2             int port = Int32.Parse(txtLocalPort.Text);
3             IPEndPoint endPoint = new IPEndPoint(address, port);
4             UdpClient udpClient = new UdpClient(endPoint);

-------------------------------------------------------------------這里是分割線-----------------------------------------------

本文主要采用第一種,基於Socket編寫一個Udp發包程序。服務器端不斷發包,客戶端根據接收到的點數據在窗體上繪制點,效果如下所示:

 

一.服務器端

1.創建一個Socket對象,綁定服務器端Ip和端口號。

2.創建一個線程用戶獲取客戶機的Ip和端口號。大致是這樣的,客戶機連接到服務器,同時發送一個"你好"的消息,服務器端這樣就可以獲取到客戶機的Ip和端口。

 1   private void btnStart_Click(object sender, EventArgs e)
 2         {
 3             if (serverSocket != null)
 4             {
 5                 return;
 6             }
 7             IPEndPoint ip = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
 8             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
 9             serverSocket.Bind(ip);
10 
11             AppendTextToTxtLog(string.Format("服務器端是{0},正在等待客戶端的連接",ip.ToString()));
12             Thread thread = new Thread(ReceiveData);
13             thread.IsBackground = true;
14             thread.Start();
15 
16         }
View Code

3.發送數據

 1  private void SendData()
 2         {
 3             byte[] data = new byte[1024 * 1024];
 4             int j = 1000;
 5             Random r = new Random(100);
 6             while (j >0)
 7             {
 8                 j--;
 9                 int x = r.Next(500);
10                 int y = r.Next(500);
11                 string msg = x.ToString() +","+ y.ToString();
12                 data = Encoding.Default.GetBytes(msg);
13                 for (int k = 0; k < RemoteList.Count; k++)
14                 {
15                     int i = serverSocket.SendTo(data, data.Length, SocketFlags.None,RemoteList[k]);
16                     AppendTextToTxtLog(string.Format("發送給客戶端{0}的消息是{1}", RemoteList[k].ToString(), msg));
17                 }
18             }
19         }
View Code

客戶端

1.連接到服務器端

 1    private void btnConnected_Click(object sender, EventArgs e)
 2         {
 3             byte[] data = new byte[1024];
 4 
 5             IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.10.179"), 50000);
 6             ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
 7             string welcome = "你好!";
 8             data = Encoding.Default.GetBytes(welcome);
 9             ServerSocket.SendTo(data, data.Length, SocketFlags.None, ip);
10             Thread thread = new Thread(ReceiveData);
11             thread.IsBackground = true;
12             thread.Start();
13         }
View Code

2.接受數據

 1  /// <summary>
 2         /// 接受消息
 3         /// </summary>
 4         private void ReceiveData()
 5         {
 6             byte[] data = new byte[1024];
 7             IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
 8             EndPoint remote = (EndPoint)endPoint;
 9             while (true)
10             {
11                 int len = 0;
12                 try
13                 {
14                    len = ServerSocket.ReceiveFrom(data, ref remote);
15                    string str = Encoding.Default.GetString(data, 0, len);
16                    string[] points = str.Split(',');
17                    int x = int.Parse(points[0]);
18                    int y = int.Parse(points[1]);
19                    Point p = new Point(x, y);
20                    Thread thread = new Thread(new ParameterizedThreadStart(drawPoint));
21                    thread.IsBackground = true;
22                    thread.Start(p);
23                 }
24                 catch (Exception  ex)
25                 {
26                     
27                    
28                 }
29             }
30         
31         }
View Code

 3.繪制

 1 /// <summary>
 2         /// 繪制
 3         /// </summary>
 4         /// <param name="p"></param>
 5         public void drawPoint(object p)
 6         {
 7 
 8             Point point = (Point)p;
 9             Graphics g = this.panel1.CreateGraphics();
10             Pen pen = new Pen(Color.Black);
11             g.DrawEllipse(pen, point.X, point.Y, 5, 5);
12         }
View Code

源碼下載: http://download.csdn.net/detail/gongchao1212/9591239

 


免責聲明!

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



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