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

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

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()

        }

    }

}

12端口就用12个线程去接收。 但处理都是尺乎槐一样的吧。

所以要有个事件 比如定义一个事件

public delegate void DataArrivalHandler(byte[] data)参数你陵友定,或者(Stream s)之类,也可以是自定一个类(包含其它信息)继承EventArgs写个 (DataEventArgs e)

public event DataArrivalHandler OnDataArrived

OnDataArrived+=()这里注册相应的方法,如果不同端口的处理不一样,就相应写不同的事件,当然也可以只定义一个方法,方法根据不同的端口处理。

while(true)

{

byte[] data = (获取)

这里获取数据后,直接调用

OnDataArrived(data)/OnDataArrived(stream)/OnDataArrived(new DataEventArgs (data,ip,port)之类,根据你定义的参数来。

}

而注册的方法里的具体实现,用委托异步调用. 方法体里执行

{

namedDelegate.beginEnvoke()

}

这样,数据处理就异步完成了。

避免数据丢失的话,做个保险。 把接收的数据放顷蚂入定义的缓冲块里。 当接收的数据量到达一定程序后,取出部分处理,再加入新数据。

类似于TCP的的滑动窗口。 麻烦点,但实现了,效果会好的多。

--------------------------

为什么要用ThreadPool? 不便于控制状态。 当你的线程处理的业务非常单一时用它,这种情况需要不需额外的状态信息,比如就像你上面的每次有不同的byte[] data。

直接 new ThreadStart()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12212110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存