初次接觸網絡編程,由於自己功力有限,一個最簡單的UPD實例都摸索了好久。
網絡上雖然有很多例子,但總是存在個別不理解的語句,終於通過一個簡單的例子,使思路能夠連續起來。
例子的實現功能:發送端發送一段字符串數據;接收端接收數據,並打印出來。
發送端代碼:
1 static void Main(string[] args) 2 { 3 IPEndPoint udpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4505); 4 UdpClient udpClient = new UdpClient(udpPoint); 5 //UdpClient udpClient = new UdpClient(); 6 string sendMsg = "Hello UDP Server."; 7 byte[] sendData = Encoding.Default.GetBytes(sendMsg); 8 IPEndPoint targetPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5500); 9 udpClient.Send(sendData, sendData.Length, targetPoint); 10 Console.WriteLine("Send Message:{0}",sendMsg); 11 Console.Read(); 12 }
1、UdpClient的實例化時需要依靠一個IpEndPoint對象,這個IpEndPoint對象在UdpClient收發數據時,起到關鍵的作用。
2、targetPoint表示,發送的數據要去往的地址。因為我在本機測試,所以targetPoint與udpPoint的兩個IPAddress是一樣的,它們之間是沒有關系的。
接收端代碼:
1 static void Main(string[] args) 2 { 3 IPEndPoint udpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5500); 4 UdpClient udpClient = new UdpClient(udpPoint); 5 //IPEndPoint senderPoint = new IPEndPoint(IPAddress.Parse("14.55.36.2"), 0); 6 IPEndPoint senderPoint = new IPEndPoint(IPAddress.Any, 0); 7 byte[] recvData = udpClient.Receive(ref senderPoint); 8 Console.WriteLine("Receive Message:{0}",Encoding.Default.GetString(recvData)); 9 Console.Read(); 10 }
1、接收端同樣初始化一個UdpClient對象,並指定其收發數據的IPEndPoint。
2、senderPint是一個IPEndPoint對象,用來存放,所接收到數據的發送者的IPEndPoint。在下面的方法udpClient.Receive中會用到。這里曾經困擾我很長時間,一直不知道這個對象在這時聲明做什么用,IPAddress.Any起到了什么作用。我的理解是,它只是為下面的Receive方法提前准備了一個對象,這個對象當前的地址和端口都不重要,重要的是,Receive方法可以使用它來存放一些東西。
3、udpClient.Receive方法,一直等待有數據傳過來,當有數據傳來時,返回數據,並將攜帶數據的IPEndPoint對象放入引用參數senderPoint中。這里我想到了一點,c#中的對象本身就是引用類型的(除了基本類型,struct等),為何還要加ref呢?似乎這里是為了明確地強調,這個要傳入的參數是會被改動的。
