C#语言中有TcpListener, 为什么没有 udplistener呢?想要侦听udp端口怎么实现?

如题所述

1)UDP是一种无连接通信协议;与此对应的TCP是有连接通信协议。通信双方采用无连接的UDP协议,那么任意一方可以随时发送数据而另一方可以随时接收数据。从这个意义上讲,UDP不需要专门处理对方连接的服务器(Listener)。因此,在.net 中没有UdpListener类,而只有UdpClient类。

2)一个简单的例子可以帮助你理解上面的概念:有两个计算机A和计算机B:A计算机的IP地址为192.168.1.10;B计算机的IP地址为192.168.1.11。

现在要求:

    两台计算机采用UDP协议进行通信。

    计算机A在8000端口等待计算机B发送的数据;

    当A接收到来自B数据后向B计算机发送“OK"

在计算机A上运行的程序如下:

/**
 * 运行在计算机A上的程序
 * */
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication1
{
    class program
    {
        static void Main()
        {
            // 1、创建一个UdpClient实例,在8000端口等待接收来自计算机B的数据
            UdpClient clientA = new UdpClient(8000);
            IPEndPoint remoteEP = null;
            // 2、等待来自计算机B的数据
            byte[] dataRecv = clientA.Receive(ref remoteEP);
            // 3、打印来自计算机B的数据
            string message = Encoding.Default.GetString(dataRecv);
            Console.WriteLine("接收到来自{0}的数据:{1}", remoteEP.ToString(), message);
            // 4、向计算机B发送"OK"
            byte[] dataSend = Encoding.Default.GetBytes("OK");
            clientA.Send(dataSend, dataSend.Length, remoteEP);

            Console.WriteLine("按任意键结束程序");
            Console.ReadKey();
            clientA.Close();
        }
    }
}

在计算机B上运行的程序如下:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1、创建一个UdpClient实例
            UdpClient clientB = new UdpClient();
            // 2、向计算机A发送数据
            byte[] dataSend = Encoding.Default.GetBytes("我是计算机B");
            // 计算机A的IP地址与端口
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.1.10"), 8000);
            clientB.Send(dataSend, dataSend.Length, remoteEP);
            //3、接收来自计算机A的应答数据
            byte[] dataRecv = clientB.Receive(ref remoteEP);
            string message = Encoding.Default.GetString(dataRecv);
            //4、显示接收的数据
            Console.WriteLine("计算机A回应的信息为:{0}", message);
            
            Console.WriteLine("按任意键结束程序");
            Console.ReadKey();
            clientB.Close();
        }
    }
}

追问

接收方在创建连接client实例时不需要指明自己的IP地址吗?只指定端口就可以了?谢谢你非常细心的回答!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-08

这个问题其实在各个高级语言中都存在。Java、Go、C# 等等语言中都是只有 TcpListener 而没有 UdpListener 的。至于为什么就不得而知了(别说什么 UDP 跟 TCP 的不同,国内外一样有很多大神级别的人物自己封装 UdpListener 类,只是官方没提供罢了)。

 

这里我们不妨猜测一下,因为 TCP 中一定是有一方充当 Server 一方充当 Client 的,充当 Server 的一方就需要一个 Listener(监听器)。而 UDP 是无连接协议,没有狭义上的 Server 和 Client,所以不需要 Listener 了。

 

虽然没有 UdpListener,但是有 UdpClient(从名字也可以看出,UDP 确实没有狭义上的 Server 和 Client 之分,每个端都可以看做是 Client)。

 

参考:

UdpClient server = new UdpClient();   
IPEndPoint receivePoint = new IPEndPoint(new IPAddress("127.0.0.1"), 8080);   
byte[] recData = server.Receive(ref receivePoint);