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 }
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 }
客戶端
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 }
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 }
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 }
源碼下載: http://download.csdn.net/detail/gongchao1212/9591239