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

 我来答
freeeeeewind
2015-02-08 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1342万
展开全部

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地址吗?只指定端口就可以了?谢谢你非常细心的回答!
威孚半导体技术
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层... 点击进入详情页
本回答由威孚半导体技术提供
然后去远足
2015-02-08 · TA获得超过1万个赞
知道大有可为答主
回答量:4016
采纳率:83%
帮助的人:2420万
展开全部

这个问题其实在各个高级语言中都存在。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);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式