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地址吗?只指定端口就可以了?谢谢你非常细心的回答!
2024-08-19 广告
这个问题其实在各个高级语言中都存在。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);