最简单的C#,UDP通讯简例。
初次接触网络编程,由于自己功力有限,一个最简单的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呢?似乎这里是为了明确地强调,这个要传入的参数是会被改动的。